diff --git a/local-network/configs/blockscout/backend/README.md b/local-network/configs/blockscout/backend/README.md new file mode 100644 index 00000000..d1d173a1 --- /dev/null +++ b/local-network/configs/blockscout/backend/README.md @@ -0,0 +1,4 @@ +# precompiled.json + +* `bytecode` - the result of `solc --bin-runtime ...` +* `abi` - the result of `solc --abi ... | jq . | tostring` diff --git a/local-network/configs/blockscout/backend/backend.yml b/local-network/configs/blockscout/backend/backend.yml index 5c561360..8d1c3d94 100644 --- a/local-network/configs/blockscout/backend/backend.yml +++ b/local-network/configs/blockscout/backend/backend.yml @@ -12,3 +12,4 @@ services: - ./bs-backend.env volumes: - ../../../logs/bs-backend/:/app/logs/prod + - ./:/assets:ro diff --git a/local-network/configs/blockscout/backend/bs-backend.env b/local-network/configs/blockscout/backend/bs-backend.env index cc95fc58..e9898777 100644 --- a/local-network/configs/blockscout/backend/bs-backend.env +++ b/local-network/configs/blockscout/backend/bs-backend.env @@ -332,3 +332,5 @@ TENDERLY_CHAIN_PATH= # BRIDGED_TOKENS_FOREIGN_JSON_RPC ADMIN_PANEL_ENABLED= RELEASE_VERSION=6.2.2 +# To have Exact Match for Bridge +PRECOMPILED_CONTRACTS_CONFIG_PATH=/assets/precompiled.json diff --git a/local-network/configs/blockscout/backend/precompiled.json b/local-network/configs/blockscout/backend/precompiled.json new file mode 100644 index 00000000..be4de23b --- /dev/null +++ b/local-network/configs/blockscout/backend/precompiled.json @@ -0,0 +1,10 @@ +[ + { + "address": "0x0000000000000000000000000000000000006a7e", + "name": "Bridge", + "bytecode": "0x60806040526004361061006e575f3560e01c806396f396c31161004c57806396f396c3146100e3578063c4a4326d14610105578063e984df0e1461011d578063fccc281314610131575f80fd5b806339dd5d1b146100725780637157405a146100b957806378338413146100ce575b5f80fd5b34801561007d575f80fd5b506100a161008c36600461059e565b5f6020819052908152604090205461ffff1681565b60405161ffff90911681526020015b60405180910390f35b3480156100c4575f80fd5b506100a161040081565b6100e16100dc3660046105b5565b61015c565b005b3480156100ee575f80fd5b506100f761044e565b6040519081526020016100b0565b348015610110575f80fd5b506100f76402540be40081565b348015610128575f80fd5b506100f7610468565b34801561013c575f80fd5b506101445f81565b6040516001600160a01b0390911681526020016100b0565b61016c6402540be40060016105fc565b34101561017834610478565b61019061018b6402540be40060016105fc565b610478565b6040516020016101a1929190610630565b604051602081830303815290604052906101d75760405162461bcd60e51b81526004016101ce9190610688565b60405180910390fd5b506101ef6402540be400677fffffffffffffff6105fc565b3411156101fb34610478565b61021561018b6402540be400677fffffffffffffff6105fc565b6040516020016102269291906106bd565b604051602081830303815290604052906102535760405162461bcd60e51b81526004016101ce9190610688565b50435f8181526020819052604090205461ffff166104009081119061027790610478565b604051602001610287919061070c565b604051602081830303815290604052906102b45760405162461bcd60e51b81526004016101ce9190610688565b505f818152602081905260408120805461ffff16916102d283610786565b91906101000a81548161ffff021916908361ffff160217905550505f6402540be400346102ff91906107a6565b9050346103116402540be400836105fc565b1461031b34610478565b6103296402540be400610478565b60405160200161033a9291906107c5565b604051602081830303815290604052906103675760405162461bcd60e51b81526004016101ce9190610688565b506040515f90819034908281818185825af1925050503d805f81146103a7576040519150601f19603f3d011682016040523d82523d5f602084013e6103ac565b606091505b50509050806103fd5760405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f2073656e6420746f206275726e2061646472657373000060448201526064016101ce565b604080516bffffffffffffffffffffffff1986168152600784900b60208201527ffeadaf04de8d7c2594453835b9a93b747e20e7a09a7fdb9280579a6dbaf131a8910160405180910390a150505050565b6104656402540be400677fffffffffffffff6105fc565b81565b6104656402540be40060016105fc565b6060815f0361049e5750506040805180820190915260018152600360fc1b602082015290565b815f5b81156104c757806104b181610814565b91506104c09050600a836107a6565b91506104a1565b5f8167ffffffffffffffff8111156104e1576104e161082c565b6040519080825280601f01601f19166020018201604052801561050b576020820181803683370190505b509050815b851561059557610521600182610840565b90505f61052f600a886107a6565b61053a90600a6105fc565b6105449088610840565b61054f906030610853565b90505f8160f81b90508084848151811061056b5761056b61086c565b60200101906001600160f81b03191690815f1a90535061058c600a896107a6565b97505050610510565b50949350505050565b5f602082840312156105ae575f80fd5b5035919050565b5f602082840312156105c5575f80fd5b81356bffffffffffffffffffffffff19811681146105e1575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610613576106136105e8565b92915050565b5f81518060208401855e5f93019283525090919050565b6a029b2b73a103b30b63ab2960ad1b81525f61064f600b830185610619565b7f206d7573742062652067726561746572206f7220657175616c20746f20000000815261067f601d820185610619565b95945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6a029b2b73a103b30b63ab2960ad1b81525f6106dc600b830185610619565b7f206d757374206265206c657373206f7220657175616c20746f20000000000000815261067f601a820185610619565b7f4d6178207472616e7366657273206c696d6974206f662000000000000000000081525f61073d6017830184610619565b7f207265616368656420696e207468697320626c6f636b2e2054727920746f207381527232b732103a3930b739b332b9399030b3b0b4b760691b60208201526033019392505050565b5f61ffff821661ffff810361079d5761079d6105e8565b60010192915050565b5f826107c057634e487b7160e01b5f52601260045260245ffd5b500490565b6a029b2b73a103b30b63ab2960ad1b81525f6107e4600b830185610619565b7f206d7573742062652061206d756c7469706c65206f6620000000000000000000815261067f6017820185610619565b5f60018201610825576108256105e8565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b81810381811115610613576106136105e8565b60ff8181168382160190811115610613576106136105e8565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220106399f534da089226c14e2f183f8421d059a924c65c97d7e4f3e931c54fe1bb64736f6c634300081a0033", + "compiler": "v0.8.26+commit.8a97fa7a", + "source": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\ncontract Bridge {\n address public constant BURN_ADDRESS = address(0);\n\n // 1 UNIT0(EL) = 1 UNIT0(CL)\n // 10^18 units in 1 UNIT0(EL)\n // 10^8 units in 1 UNIT0(CL)\n // 10^(18-8) = UNIT0(EL) / UNIT0(CL) = ratio\n // Conversion: N UNIT0(CL) = UNIT0(EL) / ratio\n uint256 public constant EL_TO_CL_RATIO = 10 ** 10; // 10 * 1 Gwei = 10 Gwei\n\n uint256 public constant MIN_AMOUNT_IN_WEI = 1 * EL_TO_CL_RATIO;\n uint256 public constant MAX_AMOUNT_IN_WEI = uint256(uint64(type(int64).max)) * EL_TO_CL_RATIO;\n\n uint16 public constant MAX_TRANSFERS_IN_BLOCK = 1024;\n\n mapping(uint => uint16) public transfersPerBlock;\n\n // wavesRecipient is a public key hash of recipient account.\n // effectively is it Waves address without 2 first bytes (version and chain id) and last 4 bytes (checksum).\n event SentNative(bytes20 wavesRecipient, int64 amount);\n\n function sendNative(bytes20 wavesRecipient) external payable {\n require(msg.value >= MIN_AMOUNT_IN_WEI, string.concat(\"Sent value \", uint2str(msg.value), \" must be greater or equal to \", uint2str(MIN_AMOUNT_IN_WEI)));\n require(msg.value <= MAX_AMOUNT_IN_WEI, string.concat(\"Sent value \", uint2str(msg.value), \" must be less or equal to \", uint2str(MAX_AMOUNT_IN_WEI)));\n\n uint blockNumber = block.number;\n require(transfersPerBlock[blockNumber] < MAX_TRANSFERS_IN_BLOCK, string.concat(\"Max transfers limit of \", uint2str(uint(MAX_TRANSFERS_IN_BLOCK)), \" reached in this block. Try to send transfers again\"));\n transfersPerBlock[blockNumber]++;\n\n uint256 ccAmount = msg.value / EL_TO_CL_RATIO;\n require(ccAmount * EL_TO_CL_RATIO == msg.value, string.concat(\"Sent value \", uint2str(msg.value), \" must be a multiple of \", uint2str(EL_TO_CL_RATIO)));\n\n (bool success,) = BURN_ADDRESS.call{value: msg.value}(\"\");\n require(success, \"Failed to send to burn address\");\n\n emit SentNative(wavesRecipient, int64(uint64(ccAmount)));\n }\n\n function uint2str(uint _i) internal pure returns (string memory _uintAsString) {\n if (_i == 0) {\n return \"0\";\n }\n uint j = _i;\n uint len;\n while (j != 0) {\n len++;\n j /= 10;\n }\n bytes memory bstr = new bytes(len);\n uint k = len;\n while (_i != 0) {\n k = k - 1;\n uint8 temp = (48 + uint8(_i - _i / 10 * 10));\n bytes1 b1 = bytes1(temp);\n bstr[k] = b1;\n _i /= 10;\n }\n return string(bstr);\n }\n}\n", + "abi": "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes20\",\"name\":\"wavesRecipient\",\"type\":\"bytes20\"},{\"indexed\":false,\"internalType\":\"int64\",\"name\":\"amount\",\"type\":\"int64\"}],\"name\":\"SentNative\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BURN_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EL_TO_CL_RATIO\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_AMOUNT_IN_WEI\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_TRANSFERS_IN_BLOCK\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_AMOUNT_IN_WEI\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes20\",\"name\":\"wavesRecipient\",\"type\":\"bytes20\"}],\"name\":\"sendNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transfersPerBlock\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" + } +]