From d5d3e76a17f827ff2e2bd0444085be5dfafcb074 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 28 Nov 2022 14:23:26 +0100 Subject: [PATCH 01/10] fix debugging proxy contract --- apps/remix-ide/src/blockchain/blockchain.js | 6 ++-- .../src/lib/compiler-artefacts.ts | 3 +- .../src/lib/compiler-fetch-and-compile.ts | 28 +++++++++++++++++++ .../src/lib/constants/uups.ts | 6 +++- .../src/lib/openzeppelin-proxy.ts | 2 +- libs/remix-lib/src/util.ts | 8 ++++++ 6 files changed, 46 insertions(+), 7 deletions(-) diff --git a/apps/remix-ide/src/blockchain/blockchain.js b/apps/remix-ide/src/blockchain/blockchain.js index 79d63c1684..3f8b22d751 100644 --- a/apps/remix-ide/src/blockchain/blockchain.js +++ b/apps/remix-ide/src/blockchain/blockchain.js @@ -11,7 +11,7 @@ import InjectedProvider from './providers/injected.js' import NodeProvider from './providers/node.js' import { execution, EventManager, helpers } from '@remix-project/remix-lib' import { etherScanLink } from './helper' -import { logBuilder, cancelUpgradeMsg, cancelProxyMsg } from "@remix-ui/helper" +import { logBuilder, cancelUpgradeMsg, cancelProxyMsg, addressToString } from "@remix-ui/helper" const { txFormat, txExecution, typeConversion, txListener: Txlistener, TxRunner, TxRunnerWeb3, txHelper } = execution const { txResultHelper: resultToRemixTx } = helpers const packageJson = require('../../../../package.json') @@ -180,7 +180,7 @@ export class Blockchain extends Plugin { if (networkInfo.name === 'VM') this.config.set('vm/proxy', address) else this.config.set(`${networkInfo.name}/${networkInfo.currentFork}/${networkInfo.id}/proxy`, address) _paq.push(['trackEvent', 'blockchain', 'Deploy With Proxy', 'Proxy deployment successful']) - return this.call('udapp', 'resolveContractAndAddInstance', implementationContractObject, address) + this.call('udapp', 'addInstance', addressToString(address), implementationContractObject.abi, implementationContractObject.name) } this.runTx(args, confirmationCb, continueCb, promptCb, finalCb) @@ -223,7 +223,7 @@ export class Blockchain extends Plugin { return this.call('terminal', 'logHtml', log) } _paq.push(['trackEvent', 'blockchain', 'Upgrade With Proxy', 'Upgrade Successful']) - return this.call('udapp', 'resolveContractAndAddInstance', newImplementationContractObject, proxyAddress) + this.call('udapp', 'addInstance', addressToString(address), newImplementationContractObject.abi, newImplementationContractObject.name) } this.runTx(args, confirmationCb, continueCb, promptCb, finalCb) } diff --git a/libs/remix-core-plugin/src/lib/compiler-artefacts.ts b/libs/remix-core-plugin/src/lib/compiler-artefacts.ts index 0d3ed3202e..6c3752b33d 100644 --- a/libs/remix-core-plugin/src/lib/compiler-artefacts.ts +++ b/libs/remix-core-plugin/src/lib/compiler-artefacts.ts @@ -198,8 +198,7 @@ export class CompilerArtefacts extends Plugin { return this.compilersArtefactsPerFile[file] } - // compilerData is a CompilerAbstract object - addResolvedContract (address, compilerData) { + addResolvedContract (address: string, compilerData: CompilerAbstract) { this.compilersArtefacts[address] = compilerData } diff --git a/libs/remix-core-plugin/src/lib/compiler-fetch-and-compile.ts b/libs/remix-core-plugin/src/lib/compiler-fetch-and-compile.ts index 3d5910d377..6aa8535a47 100644 --- a/libs/remix-core-plugin/src/lib/compiler-fetch-and-compile.ts +++ b/libs/remix-core-plugin/src/lib/compiler-fetch-and-compile.ts @@ -4,6 +4,7 @@ import { util } from '@remix-project/remix-lib' import { toChecksumAddress } from 'ethereumjs-util' import { fetchContractFromEtherscan } from './helpers/fetch-etherscan' import { fetchContractFromSourcify } from './helpers/fetch-sourcify' +import { UUPSDeployedByteCode, UUPSCompilerVersion } from './constants/uups' const profile = { name: 'fetchAndCompile', @@ -48,6 +49,33 @@ export class FetchAndCompile extends Plugin { if (resolved) return resolved if (this.unresolvedAddresses.includes(contractAddress)) return localCompilation() + if (codeAtAddress === '0x' + UUPSDeployedByteCode) { // proxy + const settings = { + version: UUPSCompilerVersion, + language: 'Solidity', + evmVersion: null, + optimize: false, + runs: 0 + } + const compilationTargets = { + 'proxy.sol': { content: 'import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/proxy/ERC1967/ERC1967Proxy.sol";' } + } + const compData = await compile( + compilationTargets, + settings, + async (url, cb) => { + // we first try to resolve the content from the compilation target using a more appropiate path + const path = `${targetPath}/${url}` + if (compilationTargets[path] && compilationTargets[path].content) { + return cb(null, compilationTargets[path].content) + } else { + await this.call('contentImport', 'resolveAndSave', url).then((result) => cb(null, result)).catch((error) => cb(error.message)) + } + }) + await this.call('compilerArtefacts', 'addResolvedContract', contractAddress, compData) + return compData + } + // sometimes when doing an internal call, the only available artifact is the Solidity interface. // resolving addresses of internal call would allow to step over the source code, even if the declaration was made using an Interface. diff --git a/libs/remix-core-plugin/src/lib/constants/uups.ts b/libs/remix-core-plugin/src/lib/constants/uups.ts index e161929f01..5b21e7ed00 100644 --- a/libs/remix-core-plugin/src/lib/constants/uups.ts +++ b/libs/remix-core-plugin/src/lib/constants/uups.ts @@ -1,5 +1,9 @@ export const UUPS = 'UUPSUpgradeable' -export const UUPSBytecode = '608060405260405162000d8638038062000d86833981810160405281019062000029919062000467565b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd60001c6200005b9190620006a5565b60001b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b146200009357620000926200078a565b5b620000a782826000620000af60201b60201c565b5050620008f4565b620000c083620000f260201b60201c565b600082511180620000ce5750805b15620000ed57620000eb83836200014960201b620000371760201c565b505b505050565b62000103816200017f60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b606062000177838360405180606001604052806027815260200162000d5f602791396200025560201b60201c565b905092915050565b62000195816200033960201b620000641760201c565b620001d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001ce90620005d0565b60405180910390fd5b80620002117f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200035c60201b620000871760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606062000268846200033960201b60201c565b620002aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a190620005f2565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1685604051620002d4919062000593565b600060405180830381855af49150503d806000811462000311576040519150601f19603f3d011682016040523d82523d6000602084013e62000316565b606091505b50915091506200032e8282866200036660201b60201c565b925050509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b606083156200037857829050620003cb565b6000835111156200038c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c29190620005ac565b60405180910390fd5b9392505050565b6000620003e9620003e3846200063d565b62000614565b9050828152602081018484840111156200040857620004076200081c565b5b620004158482856200071e565b509392505050565b6000815190506200042e81620008da565b92915050565b600082601f8301126200044c576200044b62000817565b5b81516200045e848260208601620003d2565b91505092915050565b6000806040838503121562000481576200048062000826565b5b600062000491858286016200041d565b925050602083015167ffffffffffffffff811115620004b557620004b462000821565b5b620004c38582860162000434565b9150509250929050565b6000620004da8262000673565b620004e6818562000689565b9350620004f88185602086016200071e565b80840191505092915050565b600062000511826200067e565b6200051d818562000694565b93506200052f8185602086016200071e565b6200053a816200082b565b840191505092915050565b600062000554602d8362000694565b915062000561826200083c565b604082019050919050565b60006200057b60268362000694565b915062000588826200088b565b604082019050919050565b6000620005a18284620004cd565b915081905092915050565b60006020820190508181036000830152620005c8818462000504565b905092915050565b60006020820190508181036000830152620005eb8162000545565b9050919050565b600060208201905081810360008301526200060d816200056c565b9050919050565b60006200062062000633565b90506200062e828262000754565b919050565b6000604051905090565b600067ffffffffffffffff8211156200065b576200065a620007e8565b5b62000666826200082b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000620006b28262000714565b9150620006bf8362000714565b925082821015620006d557620006d4620007b9565b5b828203905092915050565b6000620006ed82620006f4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200073e57808201518184015260208101905062000721565b838111156200074e576000848401525b50505050565b6200075f826200082b565b810181811067ffffffffffffffff82111715620007815762000780620007e8565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b620008e581620006e0565b8114620008f157600080fd5b50565b61045b80620009046000396000f3fe6080604052366100135761001161001d565b005b61001b61001d565b005b610025610091565b610035610030610093565b6100a2565b565b606061005c83836040518060600160405280602781526020016103ff602791396100c8565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b565b600061009d610195565b905090565b3660008037600080366000845af43d6000803e80600081146100c3573d6000f35b3d6000fd5b60606100d384610064565b610112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010990610319565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff168560405161013a91906102e0565b600060405180830381855af49150503d8060008114610175576040519150601f19603f3d011682016040523d82523d6000602084013e61017a565b606091505b509150915061018a8282866101ec565b925050509392505050565b60006101c37f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b610087565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606083156101fc5782905061024c565b60008351111561020f5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024391906102f7565b60405180910390fd5b9392505050565b600061025e82610339565b610268818561034f565b935061027881856020860161036b565b80840191505092915050565b600061028f82610344565b610299818561035a565b93506102a981856020860161036b565b6102b28161039e565b840191505092915050565b60006102ca60268361035a565b91506102d5826103af565b604082019050919050565b60006102ec8284610253565b915081905092915050565b600060208201905081810360008301526103118184610284565b905092915050565b60006020820190508181036000830152610332816102bd565b9050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60005b8381101561038957808201518184015260208101905061036e565b83811115610398576000848401525b50505050565b6000601f19601f8301169050919050565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e7472616374000000000000000000000000000000000000000000000000000060208201525056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201fbb70b81fbc37a0d465e50bdaf6c661d6411918ae96ccedacef32b393f9533964736f6c63430008070033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564' +// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/proxy/ERC1967/ERC1967Proxy.sol +// solidity 0.8.7 +export const UUPSBytecode = '608060405260405162000c6638038062000c6683398181016040528101906200002991906200041e565b6200003d828260006200004560201b60201c565b5050620007e2565b62000056836200008860201b60201c565b600082511180620000645750805b156200008357620000818383620000df60201b620000371760201c565b505b505050565b62000099816200011560201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606200010d838360405180606001604052806027815260200162000c3f60279139620001eb60201b60201c565b905092915050565b6200012b816200027d60201b620000641760201c565b6200016d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001649062000587565b60405180910390fd5b80620001a77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620002a060201b620000871760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516200021791906200054a565b600060405180830381855af49150503d806000811462000254576040519150601f19603f3d011682016040523d82523d6000602084013e62000259565b606091505b50915091506200027286838387620002aa60201b60201c565b925050509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b606083156200031b576000835114156200031257620002cf856200027d60201b60201c565b62000311576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030890620005a9565b60405180910390fd5b5b8290506200032e565b6200032d83836200033660201b60201c565b5b949350505050565b6000825111156200034a5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000380919062000563565b60405180910390fd5b6000620003a06200039a84620005f4565b620005cb565b905082815260208101848484011115620003bf57620003be62000730565b5b620003cc84828562000690565b509392505050565b600081519050620003e581620007c8565b92915050565b600082601f8301126200040357620004026200072b565b5b81516200041584826020860162000389565b91505092915050565b600080604083850312156200043857620004376200073a565b5b60006200044885828601620003d4565b925050602083015167ffffffffffffffff8111156200046c576200046b62000735565b5b6200047a85828601620003eb565b9150509250929050565b600062000491826200062a565b6200049d818562000640565b9350620004af81856020860162000690565b80840191505092915050565b6000620004c88262000635565b620004d481856200064b565b9350620004e681856020860162000690565b620004f1816200073f565b840191505092915050565b60006200050b602d836200064b565b9150620005188262000750565b604082019050919050565b600062000532601d836200064b565b91506200053f826200079f565b602082019050919050565b600062000558828462000484565b915081905092915050565b600060208201905081810360008301526200057f8184620004bb565b905092915050565b60006020820190508181036000830152620005a281620004fc565b9050919050565b60006020820190508181036000830152620005c48162000523565b9050919050565b6000620005d7620005ea565b9050620005e58282620006c6565b919050565b6000604051905090565b600067ffffffffffffffff821115620006125762000611620006fc565b5b6200061d826200073f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000620006698262000670565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620006b057808201518184015260208101905062000693565b83811115620006c0576000848401525b50505050565b620006d1826200073f565b810181811067ffffffffffffffff82111715620006f357620006f2620006fc565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b620007d3816200065c565b8114620007df57600080fd5b50565b61044d80620007f26000396000f3fe6080604052366100135761001161001d565b005b61001b61001d565b005b610025610091565b610035610030610093565b6100a2565b565b606061005c83836040518060600160405280602781526020016103f1602791396100c8565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b565b600061009d61014e565b905090565b3660008037600080366000845af43d6000803e80600081146100c3573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516100f291906102f8565b600060405180830381855af49150503d806000811461012d576040519150601f19603f3d011682016040523d82523d6000602084013e610132565b606091505b5091509150610143868383876101a5565b925050509392505050565b600061017c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b610087565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060831561020857600083511415610200576101c085610064565b6101ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f690610331565b60405180910390fd5b5b829050610213565b610212838361021b565b5b949350505050565b60008251111561022e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610262919061030f565b60405180910390fd5b600061027682610351565b6102808185610367565b9350610290818560208601610383565b80840191505092915050565b60006102a78261035c565b6102b18185610372565b93506102c1818560208601610383565b6102ca816103b6565b840191505092915050565b60006102e2601d83610372565b91506102ed826103c7565b602082019050919050565b6000610304828461026b565b915081905092915050565b60006020820190508181036000830152610329818461029c565b905092915050565b6000602082019050818103600083015261034a816102d5565b9050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60005b838110156103a1578082015181840152602081019050610386565b838111156103b0576000848401525b50505050565b6000601f19601f8301169050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060008201525056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122055b27d4c39ab82b8890fc1565c3858a1b7f1e0f5780871061f908d7503dcf94e64736f6c63430008070033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564' +export const UUPSDeployedByteCode = '6080604052366100135761001161001d565b005b61001b61001d565b005b610025610091565b610035610030610093565b6100a2565b565b606061005c83836040518060600160405280602781526020016103f1602791396100c8565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b565b600061009d61014e565b905090565b3660008037600080366000845af43d6000803e80600081146100c3573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516100f291906102f8565b600060405180830381855af49150503d806000811461012d576040519150601f19603f3d011682016040523d82523d6000602084013e610132565b606091505b5091509150610143868383876101a5565b925050509392505050565b600061017c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b610087565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060831561020857600083511415610200576101c085610064565b6101ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f690610331565b60405180910390fd5b5b829050610213565b610212838361021b565b5b949350505050565b60008251111561022e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610262919061030f565b60405180910390fd5b600061027682610351565b6102808185610367565b9350610290818560208601610383565b80840191505092915050565b60006102a78261035c565b6102b18185610372565b93506102c1818560208601610383565b6102ca816103b6565b840191505092915050565b60006102e2601d83610372565b91506102ed826103c7565b602082019050919050565b6000610304828461026b565b915081905092915050565b60006020820190508181036000830152610329818461029c565b905092915050565b6000602082019050818103600083015261034a816102d5565b9050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60005b838110156103a1578082015181840152602081019050610386565b838111156103b0576000848401525b50505050565b6000601f19601f8301169050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060008201525056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122055b27d4c39ab82b8890fc1565c3858a1b7f1e0f5780871061f908d7503dcf94e64736f6c63430008070033' +export const UUPSCompilerVersion = 'soljson-v0.8.7+commit.e28d00a7.js' export const UUPSABI = [ { "inputs": [ diff --git a/libs/remix-core-plugin/src/lib/openzeppelin-proxy.ts b/libs/remix-core-plugin/src/lib/openzeppelin-proxy.ts index 879351c58f..9caa46e441 100644 --- a/libs/remix-core-plugin/src/lib/openzeppelin-proxy.ts +++ b/libs/remix-core-plugin/src/lib/openzeppelin-proxy.ts @@ -119,4 +119,4 @@ export class OpenZeppelinProxy extends Plugin { newImplementationContractObject.name = proxyName this.blockchain.upgradeProxy(proxyAddress, newImplAddress, data, newImplementationContractObject) } -} +} \ No newline at end of file diff --git a/libs/remix-lib/src/util.ts b/libs/remix-lib/src/util.ts index 040f0736bf..6302ad1d98 100644 --- a/libs/remix-lib/src/util.ts +++ b/libs/remix-lib/src/util.ts @@ -239,6 +239,10 @@ export function compareByteCode (code1, code2) { code2 = replaceLibReference(code2, pos) code1 = replaceLibReference(code1, pos) } + + code1 = removeImmutableReference(code1) + code2 = removeImmutableReference(code2) + code1 = extractinputParameters(code1) code1 = extractSwarmHash(code1) code1 = extractcborMetadata(code1) @@ -276,6 +280,10 @@ function replaceLibReference (code, pos) { return code.substring(0, pos) + '0000000000000000000000000000000000000000' + code.substring(pos + 40) } +function removeImmutableReference (code) { + return code.replace(/7f([0-9a-f]{64})73/g, '') +} + function findCallInternal (index, rootCall, callsPath) { const calls = Object.keys(rootCall.calls) const ret = rootCall From a542fe661a9775b43fb4eadd173c0c6ddb1b0651 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 29 Nov 2022 11:07:23 +0100 Subject: [PATCH 02/10] add test --- libs/remix-lib/src/util.ts | 25 ++++++++++++++++++++----- libs/remix-lib/test/util.ts | 8 ++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/libs/remix-lib/src/util.ts b/libs/remix-lib/src/util.ts index 6302ad1d98..9f835eb8c8 100644 --- a/libs/remix-lib/src/util.ts +++ b/libs/remix-lib/src/util.ts @@ -240,9 +240,7 @@ export function compareByteCode (code1, code2) { code1 = replaceLibReference(code1, pos) } - code1 = removeImmutableReference(code1) - code2 = removeImmutableReference(code2) - + code1 = removeImmutableReference(code1, code2) code1 = extractinputParameters(code1) code1 = extractSwarmHash(code1) code1 = extractcborMetadata(code1) @@ -280,8 +278,25 @@ function replaceLibReference (code, pos) { return code.substring(0, pos) + '0000000000000000000000000000000000000000' + code.substring(pos + 40) } -function removeImmutableReference (code) { - return code.replace(/7f([0-9a-f]{64})73/g, '') +function removeByIndex (code, index, length, emptyRef) { + if (!code) return code + return code.slice(0, index) + emptyRef + code.slice(index + length) +} + +function removeImmutableReference (code1, code2) { + try { + const refOccurence = code2.match(/7f000000000000000000000000000000000000000000000000000000000000000073/g) + if (!refOccurence) return code1 + let offset = 0 + refOccurence.map((value) => { + offset = code2.indexOf(value, offset) + code1 = removeByIndex(code1, offset, value.length, '7f000000000000000000000000000000000000000000000000000000000000000073') + offset = offset + 1 + }) + } catch (e) { + console.log('error removeImmutableReference', e) + } + return code1 } function findCallInternal (index, rootCall, callsPath) { diff --git a/libs/remix-lib/test/util.ts b/libs/remix-lib/test/util.ts index 6035c4b134..e19674a645 100644 --- a/libs/remix-lib/test/util.ts +++ b/libs/remix-lib/test/util.ts @@ -72,7 +72,7 @@ tape('util.escapeRegExp', function (t) { }) tape('util.compareByteCode', function (t) { - t.plan(4) + t.plan(5) const address = 'c2a9cef5420203c2672f0e4325cca774893cca98' const nullAddress = '0000000000000000000000000000000000000000' @@ -90,7 +90,11 @@ tape('util.compareByteCode', function (t) { t.ok(!util.compareByteCode(sampleERC721, ERC721), 'should not match') - + + const immutableRef1 = '0x6080604052600436106101145760003560e01c806352d1902d116100a057806395d89b411161006457806395d89b4114610380578063a457c2d7146103ab578063a9059cbb146103e8578063dd62ed3e14610425578063f2fde38b1461046257610114565b806352d1902d146102bf57806370a08231146102ea578063715018a6146103275780638129fc1c1461033e5780638da5cb5b1461035557610114565b8063313ce567116100e7578063313ce567146101e95780633659cfe614610214578063395093511461023d57806340c10f191461027a5780634f1ef286146102a357610114565b806306fdde0314610119578063095ea7b31461014457806318160ddd1461018157806323b872dd146101ac575b600080fd5b34801561012557600080fd5b5061012e61048b565b60405161013b919061228a565b60405180910390f35b34801561015057600080fd5b5061016b60048036038101906101669190611e3d565b61051d565b6040516101789190612239565b60405180910390f35b34801561018d57600080fd5b50610196610540565b6040516101a3919061250c565b60405180910390f35b3480156101b857600080fd5b506101d360048036038101906101ce9190611d8e565b61054a565b6040516101e09190612239565b60405180910390f35b3480156101f557600080fd5b506101fe610579565b60405161020b9190612527565b60405180910390f35b34801561022057600080fd5b5061023b60048036038101906102369190611d21565b610582565b005b34801561024957600080fd5b50610264600480360381019061025f9190611e3d565b61070b565b6040516102719190612239565b60405180910390f35b34801561028657600080fd5b506102a1600480360381019061029c9190611e3d565b610742565b005b6102bd60048036038101906102b89190611de1565b610758565b005b3480156102cb57600080fd5b506102d4610895565b6040516102e19190612254565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190611d21565b61094e565b60405161031e919061250c565b60405180910390f35b34801561033357600080fd5b5061033c610997565b005b34801561034a57600080fd5b506103536109ab565b005b34801561036157600080fd5b5061036a610b65565b604051610377919061221e565b60405180910390f35b34801561038c57600080fd5b50610395610b8f565b6040516103a2919061228a565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190611e3d565b610c21565b6040516103df9190612239565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190611e3d565b610c98565b60405161041c9190612239565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190611d4e565b610cbb565b604051610459919061250c565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190611d21565b610d42565b005b60606036805461049a906126d3565b80601f01602080910402602001604051908101604052809291908181526020018280546104c6906126d3565b80156105135780601f106104e857610100808354040283529160200191610513565b820191906000526020600020905b8154815290600101906020018083116104f657829003601f168201915b5050505050905090565b600080610528610dc6565b9050610535818585610dce565b600191505092915050565b6000603554905090565b600080610555610dc6565b9050610562858285610f99565b61056d858585611025565b60019150509392505050565b60006012905090565b7f000000000000000000000000d9145cce52d386f254917e481eb44e9943f3913873ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106089061230c565b60405180910390fd5b7f000000000000000000000000d9145cce52d386f254917e481eb44e9943f3913873ffffffffffffffffffffffffffffffffffffffff166106506112a0565b73ffffffffffffffffffffffffffffffffffffffff16146106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d9061236c565b60405180910390fd5b6106af816112f7565b61070881600067ffffffffffffffff8111156106ce576106cd612794565b5b6040519080825280601f01601f1916602001820160405280156107005781602001600182028036833780820191505090505b506000611302565b50565b600080610716610dc6565b90506107378185856107288589610cbb565b61073291906125ca565b610dce565b600191505092915050565b61074a61147f565b61075482826114fd565b5050565b7f000000000000000000000000d9145cce52d386f254917e481eb44e9943f3913873ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de9061230c565b60405180910390fd5b7f000000000000000000000000d9145cce52d386f254917e481eb44e9943f3913873ffffffffffffffffffffffffffffffffffffffff166108266112a0565b73ffffffffffffffffffffffffffffffffffffffff161461087c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108739061236c565b60405180910390fd5b610885826112f7565b61089182826001611302565b5050565b60007f000000000000000000000000d9145cce52d386f254917e481eb44e9943f3913873ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091c9061238c565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099f61147f565b6109a96000611655565b565b60008060019054906101000a900460ff161590508080156109dc5750600160008054906101000a900460ff1660ff16105b80610a0957506109eb3061171b565b158015610a085750600160008054906101000a900460ff1660ff16145b5b610a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3f906123cc565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610a85576001600060016101000a81548160ff0219169083151502179055505b610af96040518060400160405280600781526020017f4d79546f6b656e000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d544b000000000000000000000000000000000000000000000000000000000081525061173e565b610b0161179b565b610b096117f4565b8015610b625760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610b59919061226f565b60405180910390a15b50565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610b9e906126d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca906126d3565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b5050505050905090565b600080610c2c610dc6565b90506000610c3a8286610cbb565b905083811015610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906124cc565b60405180910390fd5b610c8c8286868403610dce565b60019250505092915050565b600080610ca3610dc6565b9050610cb0818585611025565b600191505092915050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d4a61147f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db1906122cc565b60405180910390fd5b610dc381611655565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e359061248c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906122ec565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f8c919061250c565b60405180910390a3505050565b6000610fa58484610cbb565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461101f5781811015611011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110089061232c565b60405180910390fd5b61101e8484848403610dce565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c9061246c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc906122ac565b60405180910390fd5b611110838383611845565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e9061234c565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611287919061250c565b60405180910390a361129a84848461184a565b50505050565b60006112ce7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61184f565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112ff61147f565b50565b61132e7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b611859565b60000160009054906101000a900460ff16156113525761134d83611863565b61147a565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561139857600080fd5b505afa9250505080156113c957506040513d601f19601f820116820180604052508101906113c69190611e7d565b60015b611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff906123ec565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b811461146d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611464906123ac565b60405180910390fd5b5061147983838361191c565b5b505050565b611487610dc6565b73ffffffffffffffffffffffffffffffffffffffff166114a5610b65565b73ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f29061242c565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906124ec565b60405180910390fd5b61157960008383611845565b806035600082825461158b91906125ca565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161163d919061250c565b60405180910390a36116516000838361184a565b5050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff1661178d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611784906124ac565b60405180910390fd5b6117978282611948565b5050565b600060019054906101000a900460ff166117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e1906124ac565b60405180910390fd5b6117f26119c9565b565b600060019054906101000a900460ff16611843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183a906124ac565b60405180910390fd5b565b505050565b505050565b6000819050919050565b6000819050919050565b61186c8161171b565b6118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a29061240c565b60405180910390fd5b806118d87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61184f565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61192583611a2a565b6000825111806119325750805b15611943576119418383611a79565b505b505050565b600060019054906101000a900460ff16611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e906124ac565b60405180910390fd5b81603690805190602001906119ad929190611bcf565b5080603790805190602001906119c4929190611bcf565b505050565b600060019054906101000a900460ff16611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f906124ac565b60405180910390fd5b611a28611a23610dc6565b611655565b565b611a3381611863565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b6060611a848361171b565b611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba9061244c565b60405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1684604051611aeb9190612207565b600060405180830381855af49150503d8060008114611b26576040519150601f19603f3d011682016040523d82523d6000602084013e611b2b565b606091505b5091509150611b538282604051806060016040528060278152602001612d9960279139611b5d565b9250505092915050565b60608315611b6d57829050611b78565b611b778383611b7f565b5b9392505050565b600082511115611b925781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc6919061228a565b60405180910390fd5b828054611bdb906126d3565b90600052602060002090601f016020900481019282611bfd5760008555611c44565b82601f10611c1657805160ff1916838001178555611c44565b82800160010185558215611c44579182015b82811115611c43578251825591602001919060010190611c28565b5b509050611c519190611c55565b5090565b5b80821115611c6e576000816000905550600101611c56565b5090565b6000611c85611c8084612567565b612542565b905082815260208101848484011115611ca157611ca06127c8565b5b611cac848285612691565b509392505050565b600081359050611cc381612d53565b92915050565b600081519050611cd881612d6a565b92915050565b600082601f830112611cf357611cf26127c3565b5b8135611d03848260208601611c72565b91505092915050565b600081359050611d1b81612d81565b92915050565b600060208284031215611d3757611d366127d2565b5b6000611d4584828501611cb4565b91505092915050565b60008060408385031215611d6557611d646127d2565b5b6000611d7385828601611cb4565b9250506020611d8485828601611cb4565b9150509250929050565b600080600060608486031215611da757611da66127d2565b5b6000611db586828701611cb4565b9350506020611dc686828701611cb4565b9250506040611dd786828701611d0c565b9150509250925092565b60008060408385031215611df857611df76127d2565b5b6000611e0685828601611cb4565b925050602083013567ffffffffffffffff811115611e2757611e266127cd565b5b611e3385828601611cde565b9150509250929050565b60008060408385031215611e5457611e536127d2565b5b6000611e6285828601611cb4565b9250506020611e7385828601611d0c565b9150509250929050565b600060208284031215611e9357611e926127d2565b5b6000611ea184828501611cc9565b91505092915050565b611eb381612620565b82525050565b611ec281612632565b82525050565b611ed18161263e565b82525050565b6000611ee282612598565b611eec81856125ae565b9350611efc8185602086016126a0565b80840191505092915050565b611f118161267f565b82525050565b6000611f22826125a3565b611f2c81856125b9565b9350611f3c8185602086016126a0565b611f45816127d7565b840191505092915050565b6000611f5d6023836125b9565b9150611f68826127e8565b604082019050919050565b6000611f806026836125b9565b9150611f8b82612837565b604082019050919050565b6000611fa36022836125b9565b9150611fae82612886565b604082019050919050565b6000611fc6602c836125b9565b9150611fd1826128d5565b604082019050919050565b6000611fe9601d836125b9565b9150611ff482612924565b602082019050919050565b600061200c6026836125b9565b91506120178261294d565b604082019050919050565b600061202f602c836125b9565b915061203a8261299c565b604082019050919050565b60006120526038836125b9565b915061205d826129eb565b604082019050919050565b60006120756029836125b9565b915061208082612a3a565b604082019050919050565b6000612098602e836125b9565b91506120a382612a89565b604082019050919050565b60006120bb602e836125b9565b91506120c682612ad8565b604082019050919050565b60006120de602d836125b9565b91506120e982612b27565b604082019050919050565b60006121016020836125b9565b915061210c82612b76565b602082019050919050565b60006121246026836125b9565b915061212f82612b9f565b604082019050919050565b60006121476025836125b9565b915061215282612bee565b604082019050919050565b600061216a6024836125b9565b915061217582612c3d565b604082019050919050565b600061218d602b836125b9565b915061219882612c8c565b604082019050919050565b60006121b06025836125b9565b91506121bb82612cdb565b604082019050919050565b60006121d3601f836125b9565b91506121de82612d2a565b602082019050919050565b6121f281612668565b82525050565b61220181612672565b82525050565b60006122138284611ed7565b915081905092915050565b60006020820190506122336000830184611eaa565b92915050565b600060208201905061224e6000830184611eb9565b92915050565b60006020820190506122696000830184611ec8565b92915050565b60006020820190506122846000830184611f08565b92915050565b600060208201905081810360008301526122a48184611f17565b905092915050565b600060208201905081810360008301526122c581611f50565b9050919050565b600060208201905081810360008301526122e581611f73565b9050919050565b6000602082019050818103600083015261230581611f96565b9050919050565b6000602082019050818103600083015261232581611fb9565b9050919050565b6000602082019050818103600083015261234581611fdc565b9050919050565b6000602082019050818103600083015261236581611fff565b9050919050565b6000602082019050818103600083015261238581612022565b9050919050565b600060208201905081810360008301526123a581612045565b9050919050565b600060208201905081810360008301526123c581612068565b9050919050565b600060208201905081810360008301526123e58161208b565b9050919050565b60006020820190508181036000830152612405816120ae565b9050919050565b60006020820190508181036000830152612425816120d1565b9050919050565b60006020820190508181036000830152612445816120f4565b9050919050565b6000602082019050818103600083015261246581612117565b9050919050565b600060208201905081810360008301526124858161213a565b9050919050565b600060208201905081810360008301526124a58161215d565b9050919050565b600060208201905081810360008301526124c581612180565b9050919050565b600060208201905081810360008301526124e5816121a3565b9050919050565b60006020820190508181036000830152612505816121c6565b9050919050565b600060208201905061252160008301846121e9565b92915050565b600060208201905061253c60008301846121f8565b92915050565b600061254c61255d565b90506125588282612705565b919050565b6000604051905090565b600067ffffffffffffffff82111561258257612581612794565b5b61258b826127d7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006125d582612668565b91506125e083612668565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561261557612614612736565b5b828201905092915050565b600061262b82612648565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061268a82612672565b9050919050565b82818337600083830152505050565b60005b838110156126be5780820151818401526020810190506126a3565b838111156126cd576000848401525b50505050565b600060028204905060018216806126eb57607f821691505b602082108114156126ff576126fe612765565b5b50919050565b61270e826127d7565b810181811067ffffffffffffffff8211171561272d5761272c612794565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612d5c81612620565b8114612d6757600080fd5b50565b612d738161263e565b8114612d7e57600080fd5b50565b612d8a81612668565b8114612d9557600080fd5b5056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122066b4ca7b81ce7dbc6af77b0a062c617f3c53c6ec81d80662160ff3cdcd358a8064736f6c63430008070033' + const immutableRef2 = '0x6080604052600436106101145760003560e01c806352d1902d116100a057806395d89b411161006457806395d89b4114610380578063a457c2d7146103ab578063a9059cbb146103e8578063dd62ed3e14610425578063f2fde38b1461046257610114565b806352d1902d146102bf57806370a08231146102ea578063715018a6146103275780638129fc1c1461033e5780638da5cb5b1461035557610114565b8063313ce567116100e7578063313ce567146101e95780633659cfe614610214578063395093511461023d57806340c10f191461027a5780634f1ef286146102a357610114565b806306fdde0314610119578063095ea7b31461014457806318160ddd1461018157806323b872dd146101ac575b600080fd5b34801561012557600080fd5b5061012e61048b565b60405161013b919061228a565b60405180910390f35b34801561015057600080fd5b5061016b60048036038101906101669190611e3d565b61051d565b6040516101789190612239565b60405180910390f35b34801561018d57600080fd5b50610196610540565b6040516101a3919061250c565b60405180910390f35b3480156101b857600080fd5b506101d360048036038101906101ce9190611d8e565b61054a565b6040516101e09190612239565b60405180910390f35b3480156101f557600080fd5b506101fe610579565b60405161020b9190612527565b60405180910390f35b34801561022057600080fd5b5061023b60048036038101906102369190611d21565b610582565b005b34801561024957600080fd5b50610264600480360381019061025f9190611e3d565b61070b565b6040516102719190612239565b60405180910390f35b34801561028657600080fd5b506102a1600480360381019061029c9190611e3d565b610742565b005b6102bd60048036038101906102b89190611de1565b610758565b005b3480156102cb57600080fd5b506102d4610895565b6040516102e19190612254565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190611d21565b61094e565b60405161031e919061250c565b60405180910390f35b34801561033357600080fd5b5061033c610997565b005b34801561034a57600080fd5b506103536109ab565b005b34801561036157600080fd5b5061036a610b65565b604051610377919061221e565b60405180910390f35b34801561038c57600080fd5b50610395610b8f565b6040516103a2919061228a565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190611e3d565b610c21565b6040516103df9190612239565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190611e3d565b610c98565b60405161041c9190612239565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190611d4e565b610cbb565b604051610459919061250c565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190611d21565b610d42565b005b60606036805461049a906126d3565b80601f01602080910402602001604051908101604052809291908181526020018280546104c6906126d3565b80156105135780601f106104e857610100808354040283529160200191610513565b820191906000526020600020905b8154815290600101906020018083116104f657829003601f168201915b5050505050905090565b600080610528610dc6565b9050610535818585610dce565b600191505092915050565b6000603554905090565b600080610555610dc6565b9050610562858285610f99565b61056d858585611025565b60019150509392505050565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106089061230c565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166106506112a0565b73ffffffffffffffffffffffffffffffffffffffff16146106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d9061236c565b60405180910390fd5b6106af816112f7565b61070881600067ffffffffffffffff8111156106ce576106cd612794565b5b6040519080825280601f01601f1916602001820160405280156107005781602001600182028036833780820191505090505b506000611302565b50565b600080610716610dc6565b90506107378185856107288589610cbb565b61073291906125ca565b610dce565b600191505092915050565b61074a61147f565b61075482826114fd565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de9061230c565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108266112a0565b73ffffffffffffffffffffffffffffffffffffffff161461087c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108739061236c565b60405180910390fd5b610885826112f7565b61089182826001611302565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091c9061238c565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61099f61147f565b6109a96000611655565b565b60008060019054906101000a900460ff161590508080156109dc5750600160008054906101000a900460ff1660ff16105b80610a0957506109eb3061171b565b158015610a085750600160008054906101000a900460ff1660ff16145b5b610a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3f906123cc565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610a85576001600060016101000a81548160ff0219169083151502179055505b610af96040518060400160405280600781526020017f4d79546f6b656e000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d544b000000000000000000000000000000000000000000000000000000000081525061173e565b610b0161179b565b610b096117f4565b8015610b625760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610b59919061226f565b60405180910390a15b50565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610b9e906126d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca906126d3565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b5050505050905090565b600080610c2c610dc6565b90506000610c3a8286610cbb565b905083811015610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906124cc565b60405180910390fd5b610c8c8286868403610dce565b60019250505092915050565b600080610ca3610dc6565b9050610cb0818585611025565b600191505092915050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d4a61147f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db1906122cc565b60405180910390fd5b610dc381611655565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e359061248c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906122ec565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f8c919061250c565b60405180910390a3505050565b6000610fa58484610cbb565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461101f5781811015611011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110089061232c565b60405180910390fd5b61101e8484848403610dce565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c9061246c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc906122ac565b60405180910390fd5b611110838383611845565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e9061234c565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611287919061250c565b60405180910390a361129a84848461184a565b50505050565b60006112ce7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61184f565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112ff61147f565b50565b61132e7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b611859565b60000160009054906101000a900460ff16156113525761134d83611863565b61147a565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561139857600080fd5b505afa9250505080156113c957506040513d601f19601f820116820180604052508101906113c69190611e7d565b60015b611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff906123ec565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b811461146d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611464906123ac565b60405180910390fd5b5061147983838361191c565b5b505050565b611487610dc6565b73ffffffffffffffffffffffffffffffffffffffff166114a5610b65565b73ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f29061242c565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906124ec565b60405180910390fd5b61157960008383611845565b806035600082825461158b91906125ca565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161163d919061250c565b60405180910390a36116516000838361184a565b5050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff1661178d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611784906124ac565b60405180910390fd5b6117978282611948565b5050565b600060019054906101000a900460ff166117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e1906124ac565b60405180910390fd5b6117f26119c9565b565b600060019054906101000a900460ff16611843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183a906124ac565b60405180910390fd5b565b505050565b505050565b6000819050919050565b6000819050919050565b61186c8161171b565b6118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a29061240c565b60405180910390fd5b806118d87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b61184f565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61192583611a2a565b6000825111806119325750805b15611943576119418383611a79565b505b505050565b600060019054906101000a900460ff16611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e906124ac565b60405180910390fd5b81603690805190602001906119ad929190611bcf565b5080603790805190602001906119c4929190611bcf565b505050565b600060019054906101000a900460ff16611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f906124ac565b60405180910390fd5b611a28611a23610dc6565b611655565b565b611a3381611863565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b6060611a848361171b565b611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba9061244c565b60405180910390fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1684604051611aeb9190612207565b600060405180830381855af49150503d8060008114611b26576040519150601f19603f3d011682016040523d82523d6000602084013e611b2b565b606091505b5091509150611b538282604051806060016040528060278152602001612d9960279139611b5d565b9250505092915050565b60608315611b6d57829050611b78565b611b778383611b7f565b5b9392505050565b600082511115611b925781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc6919061228a565b60405180910390fd5b828054611bdb906126d3565b90600052602060002090601f016020900481019282611bfd5760008555611c44565b82601f10611c1657805160ff1916838001178555611c44565b82800160010185558215611c44579182015b82811115611c43578251825591602001919060010190611c28565b5b509050611c519190611c55565b5090565b5b80821115611c6e576000816000905550600101611c56565b5090565b6000611c85611c8084612567565b612542565b905082815260208101848484011115611ca157611ca06127c8565b5b611cac848285612691565b509392505050565b600081359050611cc381612d53565b92915050565b600081519050611cd881612d6a565b92915050565b600082601f830112611cf357611cf26127c3565b5b8135611d03848260208601611c72565b91505092915050565b600081359050611d1b81612d81565b92915050565b600060208284031215611d3757611d366127d2565b5b6000611d4584828501611cb4565b91505092915050565b60008060408385031215611d6557611d646127d2565b5b6000611d7385828601611cb4565b9250506020611d8485828601611cb4565b9150509250929050565b600080600060608486031215611da757611da66127d2565b5b6000611db586828701611cb4565b9350506020611dc686828701611cb4565b9250506040611dd786828701611d0c565b9150509250925092565b60008060408385031215611df857611df76127d2565b5b6000611e0685828601611cb4565b925050602083013567ffffffffffffffff811115611e2757611e266127cd565b5b611e3385828601611cde565b9150509250929050565b60008060408385031215611e5457611e536127d2565b5b6000611e6285828601611cb4565b9250506020611e7385828601611d0c565b9150509250929050565b600060208284031215611e9357611e926127d2565b5b6000611ea184828501611cc9565b91505092915050565b611eb381612620565b82525050565b611ec281612632565b82525050565b611ed18161263e565b82525050565b6000611ee282612598565b611eec81856125ae565b9350611efc8185602086016126a0565b80840191505092915050565b611f118161267f565b82525050565b6000611f22826125a3565b611f2c81856125b9565b9350611f3c8185602086016126a0565b611f45816127d7565b840191505092915050565b6000611f5d6023836125b9565b9150611f68826127e8565b604082019050919050565b6000611f806026836125b9565b9150611f8b82612837565b604082019050919050565b6000611fa36022836125b9565b9150611fae82612886565b604082019050919050565b6000611fc6602c836125b9565b9150611fd1826128d5565b604082019050919050565b6000611fe9601d836125b9565b9150611ff482612924565b602082019050919050565b600061200c6026836125b9565b91506120178261294d565b604082019050919050565b600061202f602c836125b9565b915061203a8261299c565b604082019050919050565b60006120526038836125b9565b915061205d826129eb565b604082019050919050565b60006120756029836125b9565b915061208082612a3a565b604082019050919050565b6000612098602e836125b9565b91506120a382612a89565b604082019050919050565b60006120bb602e836125b9565b91506120c682612ad8565b604082019050919050565b60006120de602d836125b9565b91506120e982612b27565b604082019050919050565b60006121016020836125b9565b915061210c82612b76565b602082019050919050565b60006121246026836125b9565b915061212f82612b9f565b604082019050919050565b60006121476025836125b9565b915061215282612bee565b604082019050919050565b600061216a6024836125b9565b915061217582612c3d565b604082019050919050565b600061218d602b836125b9565b915061219882612c8c565b604082019050919050565b60006121b06025836125b9565b91506121bb82612cdb565b604082019050919050565b60006121d3601f836125b9565b91506121de82612d2a565b602082019050919050565b6121f281612668565b82525050565b61220181612672565b82525050565b60006122138284611ed7565b915081905092915050565b60006020820190506122336000830184611eaa565b92915050565b600060208201905061224e6000830184611eb9565b92915050565b60006020820190506122696000830184611ec8565b92915050565b60006020820190506122846000830184611f08565b92915050565b600060208201905081810360008301526122a48184611f17565b905092915050565b600060208201905081810360008301526122c581611f50565b9050919050565b600060208201905081810360008301526122e581611f73565b9050919050565b6000602082019050818103600083015261230581611f96565b9050919050565b6000602082019050818103600083015261232581611fb9565b9050919050565b6000602082019050818103600083015261234581611fdc565b9050919050565b6000602082019050818103600083015261236581611fff565b9050919050565b6000602082019050818103600083015261238581612022565b9050919050565b600060208201905081810360008301526123a581612045565b9050919050565b600060208201905081810360008301526123c581612068565b9050919050565b600060208201905081810360008301526123e58161208b565b9050919050565b60006020820190508181036000830152612405816120ae565b9050919050565b60006020820190508181036000830152612425816120d1565b9050919050565b60006020820190508181036000830152612445816120f4565b9050919050565b6000602082019050818103600083015261246581612117565b9050919050565b600060208201905081810360008301526124858161213a565b9050919050565b600060208201905081810360008301526124a58161215d565b9050919050565b600060208201905081810360008301526124c581612180565b9050919050565b600060208201905081810360008301526124e5816121a3565b9050919050565b60006020820190508181036000830152612505816121c6565b9050919050565b600060208201905061252160008301846121e9565b92915050565b600060208201905061253c60008301846121f8565b92915050565b600061254c61255d565b90506125588282612705565b919050565b6000604051905090565b600067ffffffffffffffff82111561258257612581612794565b5b61258b826127d7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006125d582612668565b91506125e083612668565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561261557612614612736565b5b828201905092915050565b600061262b82612648565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061268a82612672565b9050919050565b82818337600083830152505050565b60005b838110156126be5780820151818401526020810190506126a3565b838111156126cd576000848401525b50505050565b600060028204905060018216806126eb57607f821691505b602082108114156126ff576126fe612765565b5b50919050565b61270e826127d7565b810181811067ffffffffffffffff8211171561272d5761272c612794565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612d5c81612620565b8114612d6757600080fd5b50565b612d738161263e565b8114612d7e57600080fd5b50565b612d8a81612668565b8114612d9557600080fd5b5056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122066b4ca7b81ce7dbc6af77b0a062c617f3c53c6ec81d80662160ff3cdcd358a8064736f6c63430008070033' + t.ok(util.compareByteCode(immutableRef1, immutableRef2), 'code contains immutable refs and should match') + }) tape('util.getInputParameters', function (t) { From c8481321854f03c40271dc201436c98ff1247d8c Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 29 Nov 2022 11:38:23 +0100 Subject: [PATCH 03/10] fix tests --- apps/remix-ide/src/blockchain/blockchain.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide/src/blockchain/blockchain.js b/apps/remix-ide/src/blockchain/blockchain.js index 3f8b22d751..1a1c591833 100644 --- a/apps/remix-ide/src/blockchain/blockchain.js +++ b/apps/remix-ide/src/blockchain/blockchain.js @@ -223,7 +223,7 @@ export class Blockchain extends Plugin { return this.call('terminal', 'logHtml', log) } _paq.push(['trackEvent', 'blockchain', 'Upgrade With Proxy', 'Upgrade Successful']) - this.call('udapp', 'addInstance', addressToString(address), newImplementationContractObject.abi, newImplementationContractObject.name) + this.call('udapp', 'addInstance', addressToString(proxyAddress), newImplementationContractObject.abi, newImplementationContractObject.name) } this.runTx(args, confirmationCb, continueCb, promptCb, finalCb) } From 30848e2f11b1c45855dd30c055e3ceaae0845948 Mon Sep 17 00:00:00 2001 From: lianahus Date: Wed, 9 Nov 2022 13:22:30 +0100 Subject: [PATCH 04/10] Refactored Learneth Section --- .../assets/css/themes/remix-dark_tvx1s2.css | 1 + .../src/lib/components/homeTabLearn.tsx | 28 ++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/remix-ide/src/assets/css/themes/remix-dark_tvx1s2.css b/apps/remix-ide/src/assets/css/themes/remix-dark_tvx1s2.css index 28503c8562..5d59273a6b 100644 --- a/apps/remix-ide/src/assets/css/themes/remix-dark_tvx1s2.css +++ b/apps/remix-ide/src/assets/css/themes/remix-dark_tvx1s2.css @@ -4018,6 +4018,7 @@ input[type="submit"].btn-block { .card-body { flex: 1 1 auto; padding: 1.25rem; + color: #b2b8cd; } .card-title { color: #DFE1EA; diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabLearn.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabLearn.tsx index daa7c6fff7..e75fbdd014 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabLearn.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabLearn.tsx @@ -49,25 +49,27 @@ function HomeTabLearn ({plugin}: HomeTabLearnProps) {
-
} - - + + + ) From 68d3755b68c2c9790f2fa3784aec7ceb4efdb7bc Mon Sep 17 00:00:00 2001 From: lianahus Date: Thu, 10 Nov 2022 16:03:43 +0100 Subject: [PATCH 05/10] scrolling fixed for buttons --- .../lib/components/customButtonGroupAsArrows.tsx | 14 -------------- .../src/lib/components/customNavButtons.tsx | 10 ++++++---- .../src/lib/components/homeTabFeatured.tsx | 15 +++++++++++++-- .../src/lib/components/homeTabFeaturedPlugins.tsx | 7 ++++--- .../src/lib/components/homeTabGetStarted.tsx | 6 +++--- .../home-tab/src/lib/components/homeTabTitle.tsx | 2 +- 6 files changed, 27 insertions(+), 27 deletions(-) delete mode 100644 libs/remix-ui/home-tab/src/lib/components/customButtonGroupAsArrows.tsx diff --git a/libs/remix-ui/home-tab/src/lib/components/customButtonGroupAsArrows.tsx b/libs/remix-ui/home-tab/src/lib/components/customButtonGroupAsArrows.tsx deleted file mode 100644 index d265e5781d..0000000000 --- a/libs/remix-ui/home-tab/src/lib/components/customButtonGroupAsArrows.tsx +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import React from 'react' - -function CustomButtonGroupAsArrows ({ next, previous }) { - return ( -
-

These buttons can be positioned anywhere you want on the screen

- - -
- ) -} - -export default CustomButtonGroupAsArrows \ No newline at end of file diff --git a/libs/remix-ui/home-tab/src/lib/components/customNavButtons.tsx b/libs/remix-ui/home-tab/src/lib/components/customNavButtons.tsx index 9418051754..5596f314de 100644 --- a/libs/remix-ui/home-tab/src/lib/components/customNavButtons.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/customNavButtons.tsx @@ -1,8 +1,10 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import React from 'react' -const CustomNavButtons = ({ next, previous, goToSlide, ...rest }) => { - const { carouselState: { currentSlide, totalItems, itemWidth, containerWidth } } = rest +const CustomNavButtons = ({ parent, next, previous, goToSlide, ...rest }) => { + const { carouselState: { currentSlide, totalItems, containerWidth, transform } } = rest + console.log("REST ", rest) + console.log("parent ", parent) return (
diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index ca5232484d..5af5c58d73 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -3,7 +3,7 @@ import React, { useEffect, useState, useRef, useContext } from 'react' import { ThemeContext, themes } from '../themeContext' import Carousel from 'react-multi-carousel' import 'react-multi-carousel/lib/styles.css' -import CustomNavButtons from './customNavButtons' +import CustomButtonGroupDots from './customButtonGroupDots' const _paq = window._paq = window._paq || [] // eslint-disable-line function HomeTabFeatured() { @@ -14,6 +14,16 @@ function HomeTabFeatured() { } }, []) + const ButtonGroup = () => { + return ( + <> + + + + + ); + }; + return (
@@ -21,7 +31,7 @@ function HomeTabFeatured() {
} + customButtonGroup={} arrows={false} swipeable={false} draggable={true} @@ -31,6 +41,7 @@ function HomeTabFeatured() { ssr={true} // means to render carousel on server-side. infinite={true} centerMode={false} + partialVisible={false} autoPlay={true} keyBoardControl={true} containerClass="border carousel-container" diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx index 9fa324e9b2..97513bb050 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx @@ -20,7 +20,7 @@ interface HomeTabFeaturedPluginsProps { function HomeTabFeaturedPlugins ({plugin}: HomeTabFeaturedPluginsProps) { const themeFilter = useContext(ThemeContext) - const carouselRef = useRef(null) + const carouselRef = useRef({}) const carouselRefDiv = useRef(null) useEffect(() => { @@ -46,8 +46,9 @@ function HomeTabFeaturedPlugins ({plugin}: HomeTabFeaturedPluginsProps) { e.stopPropagation() let nextSlide = 0 if (e.wheelDelta < 0) { + console.log("scroll") nextSlide = carouselRef.current.state.currentSlide + 1; - if ((carouselRef.current.state.totalItems - carouselRef.current.state.currentSlide) * carouselRef.current.state.itemWidth + 5 < carouselRef.current.state.containerWidth) return // 5 is approx margins + if (Math.abs(carouselRef.current.state.transform) >= carouselRef.current.containerRef.current.scrollWidth - carouselRef.current.state.containerWidth) return carouselRef.current.goToSlide(nextSlide) } else { nextSlide = carouselRef.current.state.currentSlide - 1; @@ -92,7 +93,7 @@ function HomeTabFeaturedPlugins ({plugin}: HomeTabFeaturedPluginsProps) { ref={carouselRef} focusOnSelect={true} customButtonGroup={ - + } arrows={false} swipeable={false} diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabGetStarted.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabGetStarted.tsx index ae6be5ad5c..aa65cf9dd7 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabGetStarted.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabGetStarted.tsx @@ -17,7 +17,7 @@ interface HomeTabGetStartedProps { function HomeTabGetStarted ({plugin}: HomeTabGetStartedProps) { const themeFilter = useContext(ThemeContext) - const carouselRef = useRef(null) + const carouselRef = useRef({}) const carouselRefDiv = useRef(null) useEffect(() => { @@ -44,7 +44,7 @@ function HomeTabGetStarted ({plugin}: HomeTabGetStartedProps) { let nextSlide = 0 if (e.wheelDelta < 0) { nextSlide = carouselRef.current.state.currentSlide + 1; - if ((carouselRef.current.state.totalItems - carouselRef.current.state.currentSlide) * carouselRef.current.state.itemWidth + 5 < carouselRef.current.state.containerWidth) return // 5 is approx margins + if (Math.abs(carouselRef.current.state.transform) >= carouselRef.current.containerRef.current.scrollWidth - carouselRef.current.state.containerWidth) return carouselRef.current.goToSlide(nextSlide) } else { nextSlide = carouselRef.current.state.currentSlide - 1; @@ -77,7 +77,7 @@ function HomeTabGetStarted ({plugin}: HomeTabGetStartedProps) { ref={carouselRef} focusOnSelect={true} customButtonGroup={ - + } arrows={false} swipeable={false} diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabTitle.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabTitle.tsx index 60c2420067..0ca38dc338 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabTitle.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabTitle.tsx @@ -157,7 +157,7 @@ function HomeTabTitle() { ref={searchInputRef} type="text" className="border form-control border-right-0" - id="searchInput" + id="homeTabSearchInput" placeholder="Search Documentation" data-id="terminalInputSearch" /> From 47d82ada6bd74a0d9d0c2471dcd39722d4941468 Mon Sep 17 00:00:00 2001 From: lianahus Date: Thu, 10 Nov 2022 16:07:12 +0100 Subject: [PATCH 06/10] adding a file --- .../src/lib/components/customButtonGroupDots.tsx | 15 +++++++++++++++ .../src/lib/components/homeTabFeatured.tsx | 11 ----------- 2 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 libs/remix-ui/home-tab/src/lib/components/customButtonGroupDots.tsx diff --git a/libs/remix-ui/home-tab/src/lib/components/customButtonGroupDots.tsx b/libs/remix-ui/home-tab/src/lib/components/customButtonGroupDots.tsx new file mode 100644 index 0000000000..365d86971e --- /dev/null +++ b/libs/remix-ui/home-tab/src/lib/components/customButtonGroupDots.tsx @@ -0,0 +1,15 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import React from 'react' + +const CustomButtonGroupDots = ({ next, previous, goToSlide, ...rest }) => { + const { carouselState: { currentSlide, totalItems } } = rest + + return ( +
+ + +
+ ) +} + +export default CustomButtonGroupDots diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index 5af5c58d73..3e145a5473 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -14,16 +14,6 @@ function HomeTabFeatured() { } }, []) - const ButtonGroup = () => { - return ( - <> - - - - - ); - }; - return (
@@ -41,7 +31,6 @@ function HomeTabFeatured() { ssr={true} // means to render carousel on server-side. infinite={true} centerMode={false} - partialVisible={false} autoPlay={true} keyBoardControl={true} containerClass="border carousel-container" From eb683d43afd2ca577b1cc5353ba1bd0f50792103 Mon Sep 17 00:00:00 2001 From: lianahus Date: Mon, 14 Nov 2022 12:22:18 +0100 Subject: [PATCH 07/10] cleanup --- .../lib/components/customButtonGroupDots.tsx | 15 -------------- .../src/lib/components/customNavButtons.tsx | 2 -- .../src/lib/components/homeTabFeatured.tsx | 20 +++++++------------ 3 files changed, 7 insertions(+), 30 deletions(-) delete mode 100644 libs/remix-ui/home-tab/src/lib/components/customButtonGroupDots.tsx diff --git a/libs/remix-ui/home-tab/src/lib/components/customButtonGroupDots.tsx b/libs/remix-ui/home-tab/src/lib/components/customButtonGroupDots.tsx deleted file mode 100644 index 365d86971e..0000000000 --- a/libs/remix-ui/home-tab/src/lib/components/customButtonGroupDots.tsx +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import React from 'react' - -const CustomButtonGroupDots = ({ next, previous, goToSlide, ...rest }) => { - const { carouselState: { currentSlide, totalItems } } = rest - - return ( -
- - -
- ) -} - -export default CustomButtonGroupDots diff --git a/libs/remix-ui/home-tab/src/lib/components/customNavButtons.tsx b/libs/remix-ui/home-tab/src/lib/components/customNavButtons.tsx index 5596f314de..c161a82591 100644 --- a/libs/remix-ui/home-tab/src/lib/components/customNavButtons.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/customNavButtons.tsx @@ -3,8 +3,6 @@ import React from 'react' const CustomNavButtons = ({ parent, next, previous, goToSlide, ...rest }) => { const { carouselState: { currentSlide, totalItems, containerWidth, transform } } = rest - console.log("REST ", rest) - console.log("parent ", parent) return (
- + - +
diff --git a/libs/remix-ui/publish-to-storage/src/lib/publish-to-storage.tsx b/libs/remix-ui/publish-to-storage/src/lib/publish-to-storage.tsx index 7d646043f3..05f3fbf678 100644 --- a/libs/remix-ui/publish-to-storage/src/lib/publish-to-storage.tsx +++ b/libs/remix-ui/publish-to-storage/src/lib/publish-to-storage.tsx @@ -75,6 +75,7 @@ export const PublishToStorage = (props: RemixUiPublishToStorageProps) => { try { const result = await publishToIPFS(contract, api) modal(`Published ${contract.name}'s Metadata and Sources`, publishMessage(result.uploaded)) + console.log("ptot") } catch (err) { modal('IPFS Publish Failed', publishMessageFailed(storage, err.message)) } diff --git a/libs/remix-ui/publish-to-storage/src/lib/publishToIPFS.tsx b/libs/remix-ui/publish-to-storage/src/lib/publishToIPFS.tsx index dbea8a4766..d54332e96f 100644 --- a/libs/remix-ui/publish-to-storage/src/lib/publishToIPFS.tsx +++ b/libs/remix-ui/publish-to-storage/src/lib/publishToIPFS.tsx @@ -1,7 +1,5 @@ import IpfsHttpClient from 'ipfs-http-client' - - let ipfsNodes = [] export const publishToIPFS = async (contract, api) => { @@ -93,7 +91,6 @@ export const publishToIPFS = async (contract, api) => { try { const result = await ipfsVerifiedPublish(metadataContent, '', api) - try { contract.metadataHash = result.url.match('dweb:/ipfs/(.+)')[1] } catch (e) { diff --git a/libs/remix-ui/run-tab/src/lib/css/run-tab.css b/libs/remix-ui/run-tab/src/lib/css/run-tab.css index 1c9cd7fe5b..203e315de1 100644 --- a/libs/remix-ui/run-tab/src/lib/css/run-tab.css +++ b/libs/remix-ui/run-tab/src/lib/css/run-tab.css @@ -45,8 +45,6 @@ width: 164px; min-width: 164px; } -.udapp_col2_2 { -} .udapp_select { font-weight: normal; width: 100%; @@ -314,7 +312,7 @@ .udapp_cActionsWrapper { border-top-left-radius: 0; border-bottom-left-radius: 0.25rem; - border-top-rightt-radius: 0; + border-top-right-radius: 0; border-bottom-right-radius: 0.25rem; padding: 8px 10px 7px; } From 814ca35d95aca222dd47c977250d576c57e6576a Mon Sep 17 00:00:00 2001 From: lianahus Date: Wed, 16 Nov 2022 13:48:13 +0100 Subject: [PATCH 09/10] udapp min size fixed --- .../remix-app/components/dragbar/dragbar.tsx | 2 +- .../app/src/lib/remix-app/remix-app.tsx | 2 +- .../src/lib/components/custom-dropdown.tsx | 2 +- .../src/lib/publish-to-storage.tsx | 1 - .../src/lib/components/environment.tsx | 38 +++++++++++++------ .../src/lib/components/recorderCardUI.tsx | 2 +- 6 files changed, 30 insertions(+), 17 deletions(-) diff --git a/libs/remix-ui/app/src/lib/remix-app/components/dragbar/dragbar.tsx b/libs/remix-ui/app/src/lib/remix-app/components/dragbar/dragbar.tsx index 34bf717785..d0dc3f0c6d 100644 --- a/libs/remix-ui/app/src/lib/remix-app/components/dragbar/dragbar.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/components/dragbar/dragbar.tsx @@ -61,7 +61,7 @@ const DragBar = (props: IRemixDragBarUi) => { function stopDrag(data: any) { setDragState(false) console.log("drag") - if (data.x < props.minWidth) { + if (data.x < props.minWidth + offset) { setDragBarPosX(offset) props.setHideStatus(true) } else { diff --git a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx index 06d990e5a2..3aff79e0df 100644 --- a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx @@ -85,7 +85,7 @@ const RemixApp = (props: IRemixAppUi) => {
{props.app.menuicons.render()}
{props.app.sidePanel.render()}
- +
diff --git a/libs/remix-ui/helper/src/lib/components/custom-dropdown.tsx b/libs/remix-ui/helper/src/lib/components/custom-dropdown.tsx index 4ca65cf2d3..9bb3ef0c84 100644 --- a/libs/remix-ui/helper/src/lib/components/custom-dropdown.tsx +++ b/libs/remix-ui/helper/src/lib/components/custom-dropdown.tsx @@ -13,7 +13,7 @@ export const CustomToggle = React.forwardRef(({ children, onClick, icon, classNa className={className.replace('dropdown-toggle', '')} >
-
{ children }
+
{ children }
{ icon &&
}
diff --git a/libs/remix-ui/publish-to-storage/src/lib/publish-to-storage.tsx b/libs/remix-ui/publish-to-storage/src/lib/publish-to-storage.tsx index 05f3fbf678..7d646043f3 100644 --- a/libs/remix-ui/publish-to-storage/src/lib/publish-to-storage.tsx +++ b/libs/remix-ui/publish-to-storage/src/lib/publish-to-storage.tsx @@ -75,7 +75,6 @@ export const PublishToStorage = (props: RemixUiPublishToStorageProps) => { try { const result = await publishToIPFS(contract, api) modal(`Published ${contract.name}'s Metadata and Sources`, publishMessage(result.uploaded)) - console.log("ptot") } catch (err) { modal('IPFS Publish Failed', publishMessageFailed(storage, err.message)) } diff --git a/libs/remix-ui/run-tab/src/lib/components/environment.tsx b/libs/remix-ui/run-tab/src/lib/components/environment.tsx index 8636a3b8e0..4614810ba9 100644 --- a/libs/remix-ui/run-tab/src/lib/components/environment.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/environment.tsx @@ -28,20 +28,28 @@ export function EnvironmentUI (props: EnvironmentProps) {
- - + { isL2(currentProvider) && 'L2 - '} { currentProvider && currentProvider.content } - { currentProvider && bridges[currentProvider.value] && - - } + { currentProvider && bridges[currentProvider.value] && + + } { @@ -53,14 +61,20 @@ export function EnvironmentUI (props: EnvironmentProps) { }} data-id={`dropdown-item-${value}`} > - { isL2({ value }) && 'L2 - ' }{ content } + { isL2({ value }) && 'L2 - ' }{ content } )) } - }> + } + >
diff --git a/libs/remix-ui/run-tab/src/lib/components/recorderCardUI.tsx b/libs/remix-ui/run-tab/src/lib/components/recorderCardUI.tsx index 1fa7741253..4102f20df6 100644 --- a/libs/remix-ui/run-tab/src/lib/components/recorderCardUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/recorderCardUI.tsx @@ -28,7 +28,7 @@ export function RecorderUI (props: RecorderProps) { return ( -
+