diff --git a/contracts/configs/main.json b/contracts/configs/main.json index be23dc0c..2fbcad85 100644 --- a/contracts/configs/main.json +++ b/contracts/configs/main.json @@ -52,7 +52,7 @@ "isPrimary": false }, "eth": { - "address": "0x586EE5Df24c5a426e42eD7Ea6e3EB0f00a4a2256", + "address": "DEPLOY", "denomination": 18, "isPrimary": false } @@ -103,7 +103,7 @@ "logo": "https://etherscan.io/token/images/centre-usdc_28.png", "networks": { "amb": { - "address": "0xd8dd0273D31c1cd9Dba104DaCA7C1dfEE4f7b805", + "address": "0x7A70536307a0411d2Df2FE832CFa16231089dD6F", "denomination": 18, "isPrimary": false }, @@ -162,4 +162,4 @@ } }, "ambFaucetAddress": "0x5B72903b7D2711134DD2120Bc3CA61DB6f10cB92" -} \ No newline at end of file +} diff --git a/contracts/configs/prod_addresses.ts b/contracts/configs/prod_addresses.ts index f322ae51..59c5e249 100644 --- a/contracts/configs/prod_addresses.ts +++ b/contracts/configs/prod_addresses.ts @@ -8,9 +8,9 @@ const Master_BSC_Bsc = "0x64C17b651d0c7d2dF92A7f6E7707C27C6e0535D8"; const Master_ETH_Amb = "0x0f071e1785e3E115360E04c9C8D53e958E6f85FE"; const Master_ETH_Eth = "0xFAE075e12116FBfE65c58e1Ef0E6CA959cA37ded"; -const AdminAmb = "0x203F8dCBce61d9BFa48A95F588152Da073d9c693"; -const AdminBsc = "0x3602541a2015A7867532EEF7e3A4eB2ED436a715"; -const AdminEth = "0xb6db3c082d25C0dC26602334B5F3D270091DC422"; +const AdminAmb = "0x375148D19a56e32A4D3D3d605Dc835b87f21114f"; +const AdminBsc = "0x375148D19a56e32A4D3D3d605Dc835b87f21114f"; +const AdminEth = "0x375148D19a56e32A4D3D3d605Dc835b87f21114f"; const multisig = { diff --git a/contracts/deploy/02_SyntheticTokens.ts b/contracts/deploy/02_SyntheticTokens.ts index ab563658..858c9f05 100644 --- a/contracts/deploy/02_SyntheticTokens.ts +++ b/contracts/deploy/02_SyntheticTokens.ts @@ -32,6 +32,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const deployInNonAmbNetwork = async (token: Token) => { const bridgeAddress = configFile.bridges[netName]?.side || ethers.constants.AddressZero + console.log(`TEMPORARILY USING ${owner} AS bridgeAddress instead of ${bridgeAddress}.`) const {address} = await hre.deployments.deploy(token.symbol, { contract: "BridgeERC20", args: [token.name, token.symbol, token.networks[netName].denomination, bridgeAddress], diff --git a/contracts/deployments/main/amb/USDC.json b/contracts/deployments/main/amb/USDC.json index 355319bd..0e80c7d5 100644 --- a/contracts/deployments/main/amb/USDC.json +++ b/contracts/deployments/main/amb/USDC.json @@ -1,5 +1,5 @@ { - "address": "0xd8dd0273D31c1cd9Dba104DaCA7C1dfEE4f7b805", + "address": "0x7A70536307a0411d2Df2FE832CFa16231089dD6F", "abi": [ { "inputs": [ @@ -411,34 +411,34 @@ "type": "function" } ], - "transactionHash": "0x2ef8442d2b4f641fa32244ab84e2c955b2ec24c0492e49d4f30ba93ad7caf678", + "transactionHash": "0x6284a46bd20b926c90ae3e988f82f92ebf4986debf0a0ef41aebd756a48a0202", "receipt": { "to": null, - "from": "0x203F8dCBce61d9BFa48A95F588152Da073d9c693", - "contractAddress": "0xd8dd0273D31c1cd9Dba104DaCA7C1dfEE4f7b805", + "from": "0xD693a3cc5686e74Ca2e72e8120A2F2013B8eE66E", + "contractAddress": "0x7A70536307a0411d2Df2FE832CFa16231089dD6F", "transactionIndex": 0, - "gasUsed": "1709105", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000001000000000000000000000000000000000000020000000000000000000900000000000000000000000000008000400000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000002000", - "blockHash": "0x1cb8ec7946391418eff8a3908c6260997c05c22e427428e35c00e9d0115bef6b", - "transactionHash": "0x2ef8442d2b4f641fa32244ab84e2c955b2ec24c0492e49d4f30ba93ad7caf678", + "gasUsed": "1748010", + "logsBloom": "0x00000000000000000000002000000000003000000000000000800000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000002000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x2669dc2c55af6db66f2344824df902c887c95fec036fd345c152645c8aff3548", + "transactionHash": "0x6284a46bd20b926c90ae3e988f82f92ebf4986debf0a0ef41aebd756a48a0202", "logs": [ { "transactionIndex": 0, - "blockNumber": 20551132, - "transactionHash": "0x2ef8442d2b4f641fa32244ab84e2c955b2ec24c0492e49d4f30ba93ad7caf678", - "address": "0xd8dd0273D31c1cd9Dba104DaCA7C1dfEE4f7b805", + "blockNumber": 30092846, + "transactionHash": "0x6284a46bd20b926c90ae3e988f82f92ebf4986debf0a0ef41aebd756a48a0202", + "address": "0x7A70536307a0411d2Df2FE832CFa16231089dD6F", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000203f8dcbce61d9bfa48a95f588152da073d9c693" + "0x000000000000000000000000d693a3cc5686e74ca2e72e8120a2f2013b8ee66e" ], "data": "0x", "logIndex": 0, - "blockHash": "0x1cb8ec7946391418eff8a3908c6260997c05c22e427428e35c00e9d0115bef6b" + "blockHash": "0x2669dc2c55af6db66f2344824df902c887c95fec036fd345c152645c8aff3548" } ], - "blockNumber": 20551132, - "cumulativeGasUsed": "1709105", + "blockNumber": 30092846, + "cumulativeGasUsed": "1748010", "status": 1, "byzantium": true }, @@ -455,11 +455,11 @@ 18 ] ], - "numDeployments": 1, - "solcInputHash": "69020b40437284b18cf851065318173d", - "metadata": "{\"compiler\":{\"version\":\"0.8.6+commit.11564f7e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"bridgeAddresses_\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"sideTokenDecimals_\",\"type\":\"uint8[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"bridgeBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"bridgeAddresses_\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"sideTokenDecimals_\",\"type\":\"uint8[]\"}],\"name\":\"setSideTokenDecimals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"sideTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/tokens/BridgeERC20_Amb.sol\":\"BridgeERC20_Amb\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `recipient` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n _transfer(_msgSender(), recipient, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n _approve(_msgSender(), spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * Requirements:\\n *\\n * - `sender` and `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``sender``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `sender` cannot be the zero address.\\n * - `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) internal virtual {\\n require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(sender, recipient, amount);\\n\\n uint256 senderBalance = _balances[sender];\\n require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[sender] = senderBalance - amount;\\n }\\n _balances[recipient] += amount;\\n\\n emit Transfer(sender, recipient, amount);\\n\\n _afterTokenTransfer(sender, recipient, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/tokens/BridgeERC20_Amb.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.6;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract BridgeERC20_Amb is ERC20, Ownable {\\n\\n // decimals of token in side network\\n // example:\\n // 0xBSC_Amb => 18 (AMB contract of BSC bridge => 18 decimals)\\n // 0xETH_Amb => 6 (AMB contract of ETH bridge => 6 decimals)\\n // now, token will auto convert self _decimals to side _decimals (or vice versa) on bridge transfer\\n // NOTE: value 0 means that address is not a bridge; DON'T SET NON ZERO VALUES FOR NON BRIDGE ADDRESSES\\n mapping(address => uint8) public sideTokenDecimals;\\n\\n mapping(address => uint) public bridgeBalances; // locked tokens on the side bridge\\n\\n uint8 _decimals;\\n\\n constructor(\\n string memory name_, string memory symbol_, uint8 decimals_,\\n address[] memory bridgeAddresses_, uint8[] memory sideTokenDecimals_\\n ) ERC20(name_, symbol_) Ownable() {\\n _setSideTokenDecimals(bridgeAddresses_, sideTokenDecimals_);\\n _decimals = decimals_;\\n }\\n\\n function decimals() public view override returns (uint8) {\\n return _decimals;\\n }\\n\\n function setSideTokenDecimals(address[] memory bridgeAddresses_, uint8[] memory sideTokenDecimals_) public onlyOwner() {\\n _setSideTokenDecimals(bridgeAddresses_, sideTokenDecimals_);\\n }\\n\\n // todo check if we need this func\\n function _setSideTokenDecimals(address[] memory bridgeAddresses_, uint8[] memory sideTokenDecimals_) private {\\n require(bridgeAddresses_.length == sideTokenDecimals_.length, \\\"wrong array lengths\\\");\\n for (uint i = 0; i < bridgeAddresses_.length; i++)\\n sideTokenDecimals[bridgeAddresses_[i]] = sideTokenDecimals_[i];\\n }\\n\\n function _transfer(\\n address sender,\\n address recipient,\\n uint amount\\n ) internal virtual override {\\n // todo events\\n if (sideTokenDecimals[sender] != 0) { // sender is bridge\\n // user transfer tokens to ambrosus => need to mint it\\n\\n // we receive tokens from network where token have sideTokenDecimals[sender] decimals\\n // convert amount with SIDE network decimals form to SELF decimals form\\n uint amount_this = _convertDecimals(amount, sideTokenDecimals[sender], _decimals);\\n\\n\\n // bridge mint money to user; same amount locked on side bridge\\n bridgeBalances[sender] += amount_this;\\n\\n _mint(recipient, amount_this);\\n } else if (sideTokenDecimals[recipient] != 0) { // recipient is bridge\\n // user withdraw tokens from ambrosus => need to burn it\\n\\n // we transfer tokens to network where token have sideTokenDecimals[sender] decimals\\n // convert amount with SIDE network decimals form to SELF decimals form\\n uint amount_this = _convertDecimals(amount, sideTokenDecimals[recipient], _decimals);\\n\\n\\n // user burn tokens; side bridge must have enough tokens to send\\n require(bridgeBalances[recipient] >= amount_this, \\\"not enough locked tokens on bridge\\\");\\n bridgeBalances[recipient] -= amount_this;\\n\\n _burn(sender, amount_this);\\n } else {\\n super._transfer(sender, recipient, amount);\\n }\\n }\\n\\n function _convertDecimals(uint256 amount, uint8 dFrom, uint8 dTo) internal pure returns (uint256) {\\n if (dTo == dFrom)\\n return amount;\\n if (dTo > dFrom)\\n return amount * (10 ** (dTo - dFrom));\\n else\\n return amount / (10 ** (dFrom - dTo));\\n }\\n\\n}\\n\",\"keccak256\":\"0xd4ef121631f7a651ebe5f73c8565f862fa43cae907804e7876b29e87ce36a1cf\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162001bce38038062001bce8339810160408190526200003491620003fc565b8451859085906200004d9060039060208501906200022a565b508051620000639060049060208401906200022a565b5050506200009262000083620000c6640100000000026401000000009004565b640100000000620000ca810204565b620000a782826401000000006200011c810204565b50506008805460ff191660ff92909216919091179055506200068b9050565b3390565b60058054600160a060020a03838116600160a060020a0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80518251146200018c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206172726179206c656e6774687300000000000000000000000000604482015260640160405180910390fd5b60005b82518110156200022557818181518110620001ae57620001ae6200062d565b602002602001015160066000858481518110620001cf57620001cf6200062d565b6020026020010151600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806200021c90620005ea565b9150506200018f565b505050565b828054620002389062000594565b90600052602060002090601f0160209004810192826200025c5760008555620002a7565b82601f106200027757805160ff1916838001178555620002a7565b82800160010185558215620002a7579182015b82811115620002a75782518255916020019190600101906200028a565b50620002b5929150620002b9565b5090565b5b80821115620002b55760008155600101620002ba565b600082601f830112620002e257600080fd5b81516020620002fb620002f5836200056e565b6200053b565b82815281810190858301838502870184018810156200031957600080fd5b60005b8581101562000343576200033082620003e5565b845292840192908401906001016200031c565b5090979650505050505050565b600082601f8301126200036257600080fd5b81516001604060020a038111156200037e576200037e6200065c565b602062000394601f8301601f191682016200053b565b8281528582848701011115620003a957600080fd5b60005b83811015620003c9578581018301518282018401528201620003ac565b83811115620003db5760008385840101525b5095945050505050565b805160ff81168114620003f757600080fd5b919050565b600080600080600060a086880312156200041557600080fd5b85516001604060020a03808211156200042d57600080fd5b6200043b89838a0162000350565b96506020915081880151818111156200045357600080fd5b620004618a828b0162000350565b9650506200047260408901620003e5565b94506060880151818111156200048757600080fd5b8801601f81018a136200049957600080fd5b8051620004aa620002f5826200056e565b81815284810190838601868402850187018e1015620004c857600080fd5b600094505b8385101562000503578051600160a060020a0381168114620004ee57600080fd5b835260019490940193918601918601620004cd565b5060808c01519097509450505050808211156200051f57600080fd5b506200052e88828901620002d0565b9150509295509295909350565b604051601f8201601f191681016001604060020a03811182821017156200056657620005666200065c565b604052919050565b60006001604060020a038211156200058a576200058a6200065c565b5060209081020190565b600281046001821680620005a957607f821691505b60208210811415620005e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060001982141562000626577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611533806200069b6000396000f3fe608060405234801561001057600080fd5b5060043610610128576000357c010000000000000000000000000000000000000000000000000000000090048063715018a6116100bf578063a9059cbb1161008e578063a9059cbb1461024f578063dc1ab98a14610262578063dd62ed3e14610282578063f2fde38b146102bb578063f590e1e6146102ce57600080fd5b8063715018a61461020f5780638da5cb5b1461021957806395d89b4114610234578063a457c2d71461023c57600080fd5b806323b872dd116100fb57806323b872dd146101b5578063313ce567146101c857806339509351146101d357806370a08231146101e657600080fd5b806306fdde031461012d578063095ea7b31461014b57806318160ddd1461016e5780631d836adf14610180575b600080fd5b6101356102e1565b60405161014291906111f3565b60405180910390f35b61015e610159366004611105565b610373565b6040519015158152602001610142565b6002545b604051908152602001610142565b6101a361018e36600461107b565b60066020526000908152604090205460ff1681565b60405160ff9091168152602001610142565b61015e6101c33660046110c9565b61038a565b60085460ff166101a3565b61015e6101e1366004611105565b610453565b6101726101f436600461107b565b600160a060020a031660009081526020819052604090205490565b61021761048f565b005b600554604051600160a060020a039091168152602001610142565b6101356104c8565b61015e61024a366004611105565b6104d7565b61015e61025d366004611105565b61058b565b61017261027036600461107b565b60076020526000908152604090205481565b610172610290366004611096565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b6102176102c936600461107b565b610598565b6102176102dc36600461112f565b610650565b6060600380546102f090611459565b80601f016020809104026020016040519081016040528092919081815260200182805461031c90611459565b80156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b600061038033848461068b565b5060015b92915050565b60006103978484846107e9565b600160a060020a0384166000908152600160209081526040808320338452909152902054828110156104395760405160e560020a62461bcd02815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610446853385840361068b565b60019150505b9392505050565b336000818152600160209081526040808320600160a060020a0387168452909152812054909161038091859061048a9086906112d2565b61068b565b600554600160a060020a031633146104bc5760405160e560020a62461bcd02815260040161043090611248565b6104c660006109a6565b565b6060600480546102f090611459565b336000908152600160209081526040808320600160a060020a0386168452909152812054828110156105745760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610430565b610581338585840361068b565b5060019392505050565b60006103803384846107e9565b600554600160a060020a031633146105c55760405160e560020a62461bcd02815260040161043090611248565b600160a060020a0381166106445760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610430565b61064d816109a6565b50565b600554600160a060020a0316331461067d5760405160e560020a62461bcd02815260040161043090611248565b6106878282610a05565b5050565b600160a060020a0383166107095760405160e560020a62461bcd028152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a0382166107885760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600160a060020a03831660009081526006602052604090205460ff161561087b57600160a060020a03831660009081526006602052604081205460085461083891849160ff9182169116610ae8565b600160a060020a0385166000908152600760205260408120805492935083929091906108659084906112d2565b9091555061087590508382610b52565b50505050565b600160a060020a03821660009081526006602052604090205460ff161561099657600160a060020a0382166000908152600660205260408120546008546108ca91849160ff9182169116610ae8565b600160a060020a03841660009081526007602052604090205490915081111561095e5760405160e560020a62461bcd02815260206004820152602260248201527f6e6f7420656e6f756768206c6f636b656420746f6b656e73206f6e206272696460448201527f67650000000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a0383166000908152600760205260408120805483929061098690849061141f565b9091555061087590508482610c34565b6109a1838383610dbf565b505050565b60058054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8051825114610a595760405160e560020a62461bcd02815260206004820152601360248201527f77726f6e67206172726179206c656e67746873000000000000000000000000006044820152606401610430565b60005b82518110156109a157818181518110610a7757610a776114cb565b602002602001015160066000858481518110610a9557610a956114cb565b6020026020010151600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610ae090611497565b915050610a5c565b60008260ff168260ff161415610aff57508261044c565b8260ff168260ff161115610b3357610b178383611436565b610b2290600a611354565b610b2c9085611400565b905061044c565b610b3d8284611436565b610b4890600a611354565b610b2c90856112ea565b600160a060020a038216610bab5760405160e560020a62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610430565b8060026000828254610bbd91906112d2565b9091555050600160a060020a03821660009081526020819052604081208054839290610bea9084906112d2565b9091555050604051818152600160a060020a038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600160a060020a038216610cb35760405160e560020a62461bcd02815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a03821660009081526020819052604090205481811015610d455760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a0383166000908152602081905260408120838303905560028054849290610d7490849061141f565b9091555050604051828152600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600160a060020a038316610e3e5760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a038216610ebd5760405160e560020a62461bcd02815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a03831660009081526020819052604090205481811015610f4f5760405160e560020a62461bcd02815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a03808516600090815260208190526040808220858503905591851681529081208054849290610f869084906112d2565b9250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fd291815260200190565b60405180910390a350505050565b8035600160a060020a0381168114610ff757600080fd5b919050565b600082601f83011261100d57600080fd5b8135602061102261101d836112ae565b61127d565b828152818101908583018385028701840188101561103f57600080fd5b6000805b8681101561106d57823560ff8116811461105b578283fd5b85529385019391850191600101611043565b509198975050505050505050565b60006020828403121561108d57600080fd5b61044c82610fe0565b600080604083850312156110a957600080fd5b6110b283610fe0565b91506110c060208401610fe0565b90509250929050565b6000806000606084860312156110de57600080fd5b6110e784610fe0565b92506110f560208501610fe0565b9150604084013590509250925092565b6000806040838503121561111857600080fd5b61112183610fe0565b946020939093013593505050565b6000806040838503121561114257600080fd5b823567ffffffffffffffff8082111561115a57600080fd5b818501915085601f83011261116e57600080fd5b8135602061117e61101d836112ae565b82815281810190858301838502870184018b101561119b57600080fd5b600096505b848710156111c5576111b181610fe0565b8352600196909601959183019183016111a0565b50965050860135925050808211156111dc57600080fd5b506111e985828601610ffc565b9150509250929050565b600060208083528351808285015260005b8181101561122057858101830151858201604001528201611204565b81811115611232576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156112a6576112a66114e4565b604052919050565b600067ffffffffffffffff8211156112c8576112c86114e4565b5060209081020190565b600082198211156112e5576112e56114b2565b500190565b60008261130a5760e060020a634e487b7102600052601260045260246000fd5b500490565b600181815b8085111561134c578160001904821115611330576113306114b2565b8085161561133d57918102915b60029094049390800290611314565b509250929050565b600061044c60ff84168360008261136d57506001610384565b8161137a57506000610384565b8160018114611390576002811461139a576113b7565b6001915050610384565b60ff8411156113ab576113ab6114b2565b8360020a915050610384565b5060208310610133831016604e8410600b84101617156113da575081810a610384565b6113e4838361130f565b80600019048211156113f8576113f86114b2565b029392505050565b600081600019048311821515161561141a5761141a6114b2565b500290565b600082821015611431576114316114b2565b500390565b600060ff821660ff841680821015611450576114506114b2565b90039392505050565b60028104600182168061146d57607f821691505b602082108114156114915760e060020a634e487b7102600052602260045260246000fd5b50919050565b60006000198214156114ab576114ab6114b2565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603260045260246000fd5b60e060020a634e487b7102600052604160045260246000fdfea26469706673582212206b2785398fb5d85e9f4e501b73aeebdf28671c2de2180c0a2e1996c5a262966364736f6c63430008060033", - "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610128576000357c010000000000000000000000000000000000000000000000000000000090048063715018a6116100bf578063a9059cbb1161008e578063a9059cbb1461024f578063dc1ab98a14610262578063dd62ed3e14610282578063f2fde38b146102bb578063f590e1e6146102ce57600080fd5b8063715018a61461020f5780638da5cb5b1461021957806395d89b4114610234578063a457c2d71461023c57600080fd5b806323b872dd116100fb57806323b872dd146101b5578063313ce567146101c857806339509351146101d357806370a08231146101e657600080fd5b806306fdde031461012d578063095ea7b31461014b57806318160ddd1461016e5780631d836adf14610180575b600080fd5b6101356102e1565b60405161014291906111f3565b60405180910390f35b61015e610159366004611105565b610373565b6040519015158152602001610142565b6002545b604051908152602001610142565b6101a361018e36600461107b565b60066020526000908152604090205460ff1681565b60405160ff9091168152602001610142565b61015e6101c33660046110c9565b61038a565b60085460ff166101a3565b61015e6101e1366004611105565b610453565b6101726101f436600461107b565b600160a060020a031660009081526020819052604090205490565b61021761048f565b005b600554604051600160a060020a039091168152602001610142565b6101356104c8565b61015e61024a366004611105565b6104d7565b61015e61025d366004611105565b61058b565b61017261027036600461107b565b60076020526000908152604090205481565b610172610290366004611096565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b6102176102c936600461107b565b610598565b6102176102dc36600461112f565b610650565b6060600380546102f090611459565b80601f016020809104026020016040519081016040528092919081815260200182805461031c90611459565b80156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b600061038033848461068b565b5060015b92915050565b60006103978484846107e9565b600160a060020a0384166000908152600160209081526040808320338452909152902054828110156104395760405160e560020a62461bcd02815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610446853385840361068b565b60019150505b9392505050565b336000818152600160209081526040808320600160a060020a0387168452909152812054909161038091859061048a9086906112d2565b61068b565b600554600160a060020a031633146104bc5760405160e560020a62461bcd02815260040161043090611248565b6104c660006109a6565b565b6060600480546102f090611459565b336000908152600160209081526040808320600160a060020a0386168452909152812054828110156105745760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610430565b610581338585840361068b565b5060019392505050565b60006103803384846107e9565b600554600160a060020a031633146105c55760405160e560020a62461bcd02815260040161043090611248565b600160a060020a0381166106445760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610430565b61064d816109a6565b50565b600554600160a060020a0316331461067d5760405160e560020a62461bcd02815260040161043090611248565b6106878282610a05565b5050565b600160a060020a0383166107095760405160e560020a62461bcd028152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a0382166107885760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600160a060020a03831660009081526006602052604090205460ff161561087b57600160a060020a03831660009081526006602052604081205460085461083891849160ff9182169116610ae8565b600160a060020a0385166000908152600760205260408120805492935083929091906108659084906112d2565b9091555061087590508382610b52565b50505050565b600160a060020a03821660009081526006602052604090205460ff161561099657600160a060020a0382166000908152600660205260408120546008546108ca91849160ff9182169116610ae8565b600160a060020a03841660009081526007602052604090205490915081111561095e5760405160e560020a62461bcd02815260206004820152602260248201527f6e6f7420656e6f756768206c6f636b656420746f6b656e73206f6e206272696460448201527f67650000000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a0383166000908152600760205260408120805483929061098690849061141f565b9091555061087590508482610c34565b6109a1838383610dbf565b505050565b60058054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8051825114610a595760405160e560020a62461bcd02815260206004820152601360248201527f77726f6e67206172726179206c656e67746873000000000000000000000000006044820152606401610430565b60005b82518110156109a157818181518110610a7757610a776114cb565b602002602001015160066000858481518110610a9557610a956114cb565b6020026020010151600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610ae090611497565b915050610a5c565b60008260ff168260ff161415610aff57508261044c565b8260ff168260ff161115610b3357610b178383611436565b610b2290600a611354565b610b2c9085611400565b905061044c565b610b3d8284611436565b610b4890600a611354565b610b2c90856112ea565b600160a060020a038216610bab5760405160e560020a62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610430565b8060026000828254610bbd91906112d2565b9091555050600160a060020a03821660009081526020819052604081208054839290610bea9084906112d2565b9091555050604051818152600160a060020a038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600160a060020a038216610cb35760405160e560020a62461bcd02815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a03821660009081526020819052604090205481811015610d455760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a0383166000908152602081905260408120838303905560028054849290610d7490849061141f565b9091555050604051828152600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600160a060020a038316610e3e5760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a038216610ebd5760405160e560020a62461bcd02815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a03831660009081526020819052604090205481811015610f4f5760405160e560020a62461bcd02815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610430565b600160a060020a03808516600090815260208190526040808220858503905591851681529081208054849290610f869084906112d2565b9250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fd291815260200190565b60405180910390a350505050565b8035600160a060020a0381168114610ff757600080fd5b919050565b600082601f83011261100d57600080fd5b8135602061102261101d836112ae565b61127d565b828152818101908583018385028701840188101561103f57600080fd5b6000805b8681101561106d57823560ff8116811461105b578283fd5b85529385019391850191600101611043565b509198975050505050505050565b60006020828403121561108d57600080fd5b61044c82610fe0565b600080604083850312156110a957600080fd5b6110b283610fe0565b91506110c060208401610fe0565b90509250929050565b6000806000606084860312156110de57600080fd5b6110e784610fe0565b92506110f560208501610fe0565b9150604084013590509250925092565b6000806040838503121561111857600080fd5b61112183610fe0565b946020939093013593505050565b6000806040838503121561114257600080fd5b823567ffffffffffffffff8082111561115a57600080fd5b818501915085601f83011261116e57600080fd5b8135602061117e61101d836112ae565b82815281810190858301838502870184018b101561119b57600080fd5b600096505b848710156111c5576111b181610fe0565b8352600196909601959183019183016111a0565b50965050860135925050808211156111dc57600080fd5b506111e985828601610ffc565b9150509250929050565b600060208083528351808285015260005b8181101561122057858101830151858201604001528201611204565b81811115611232576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156112a6576112a66114e4565b604052919050565b600067ffffffffffffffff8211156112c8576112c86114e4565b5060209081020190565b600082198211156112e5576112e56114b2565b500190565b60008261130a5760e060020a634e487b7102600052601260045260246000fd5b500490565b600181815b8085111561134c578160001904821115611330576113306114b2565b8085161561133d57918102915b60029094049390800290611314565b509250929050565b600061044c60ff84168360008261136d57506001610384565b8161137a57506000610384565b8160018114611390576002811461139a576113b7565b6001915050610384565b60ff8411156113ab576113ab6114b2565b8360020a915050610384565b5060208310610133831016604e8410600b84101617156113da575081810a610384565b6113e4838361130f565b80600019048211156113f8576113f86114b2565b029392505050565b600081600019048311821515161561141a5761141a6114b2565b500290565b600082821015611431576114316114b2565b500390565b600060ff821660ff841680821015611450576114506114b2565b90039392505050565b60028104600182168061146d57607f821691505b602082108114156114915760e060020a634e487b7102600052602260045260246000fd5b50919050565b60006000198214156114ab576114ab6114b2565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603260045260246000fd5b60e060020a634e487b7102600052604160045260246000fdfea26469706673582212206b2785398fb5d85e9f4e501b73aeebdf28671c2de2180c0a2e1996c5a262966364736f6c63430008060033", + "numDeployments": 2, + "solcInputHash": "af3862e0ddcca2861ee723b668139921", + "metadata": "{\"compiler\":{\"version\":\"0.8.6+commit.11564f7e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"bridgeAddresses_\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"sideTokenDecimals_\",\"type\":\"uint8[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"bridgeBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"bridgeAddresses_\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"sideTokenDecimals_\",\"type\":\"uint8[]\"}],\"name\":\"setSideTokenDecimals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"sideTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/tokens/BridgeERC20_Amb.sol\":\"BridgeERC20_Amb\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `recipient` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n _transfer(_msgSender(), recipient, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n _approve(_msgSender(), spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * Requirements:\\n *\\n * - `sender` and `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``sender``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `sender` cannot be the zero address.\\n * - `recipient` cannot be the zero address.\\n * - `sender` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) internal virtual {\\n require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(sender, recipient, amount);\\n\\n uint256 senderBalance = _balances[sender];\\n require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[sender] = senderBalance - amount;\\n }\\n _balances[recipient] += amount;\\n\\n emit Transfer(sender, recipient, amount);\\n\\n _afterTokenTransfer(sender, recipient, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0xb03df8481a954604ad0c9125680893b2e3f7ff770fe470e38b89ac61b84e8072\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/tokens/BridgeERC20_Amb.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.6;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract BridgeERC20_Amb is ERC20, Ownable {\\n\\n // decimals of token in side network\\n // example:\\n // 0xBSC_Amb => 18 (AMB contract of BSC bridge => 18 decimals)\\n // 0xETH_Amb => 6 (AMB contract of ETH bridge => 6 decimals)\\n // now, token will auto convert self _decimals to side _decimals (or vice versa) on bridge transfer\\n // NOTE: value 0 means that address is not a bridge; DON'T SET NON ZERO VALUES FOR NON BRIDGE ADDRESSES\\n mapping(address => uint8) public sideTokenDecimals;\\n\\n mapping(address => uint) public bridgeBalances; // locked tokens on the side bridge\\n\\n uint8 _decimals;\\n\\n constructor(\\n string memory name_, string memory symbol_, uint8 decimals_,\\n address[] memory bridgeAddresses_, uint8[] memory sideTokenDecimals_\\n ) ERC20(name_, symbol_) Ownable() {\\n _setSideTokenDecimals(bridgeAddresses_, sideTokenDecimals_);\\n _decimals = decimals_;\\n }\\n\\n function decimals() public view override returns (uint8) {\\n return _decimals;\\n }\\n\\n function setSideTokenDecimals(address[] memory bridgeAddresses_, uint8[] memory sideTokenDecimals_) public onlyOwner() {\\n _setSideTokenDecimals(bridgeAddresses_, sideTokenDecimals_);\\n }\\n\\n // todo check if we need this func\\n function _setSideTokenDecimals(address[] memory bridgeAddresses_, uint8[] memory sideTokenDecimals_) private {\\n require(bridgeAddresses_.length == sideTokenDecimals_.length, \\\"wrong array lengths\\\");\\n for (uint i = 0; i < bridgeAddresses_.length; i++)\\n sideTokenDecimals[bridgeAddresses_[i]] = sideTokenDecimals_[i];\\n }\\n\\n\\n function transferFrom(\\n address sender,\\n address recipient,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n _transfer(sender, recipient, amount);\\n\\n // convert decimals just like in _transfer function\\n if (sideTokenDecimals[sender] != 0) { // sender is bridge\\n amount = _convertDecimals(amount, sideTokenDecimals[sender], _decimals);\\n } else if (sideTokenDecimals[recipient] != 0) { // recipient is bridge\\n amount = _convertDecimals(amount, sideTokenDecimals[recipient], _decimals);\\n }\\n\\n uint256 currentAllowance = allowance(sender,_msgSender());\\n require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n unchecked {\\n _approve(sender, _msgSender(), currentAllowance - amount);\\n }\\n\\n return true;\\n }\\n\\n function _transfer(\\n address sender,\\n address recipient,\\n uint amount\\n ) internal virtual override {\\n if (sideTokenDecimals[sender] != 0) { // sender is bridge\\n // user transfer tokens to ambrosus => need to mint it\\n\\n // we receive tokens from network where token have sideTokenDecimals[sender] decimals\\n // convert amount with SIDE network decimals form to SELF decimals form\\n uint amount_this = _convertDecimals(amount, sideTokenDecimals[sender], _decimals);\\n\\n\\n // bridge mint money to user; same amount locked on side bridge\\n bridgeBalances[sender] += amount_this;\\n\\n _mint(recipient, amount_this);\\n } else if (sideTokenDecimals[recipient] != 0) { // recipient is bridge\\n // user withdraw tokens from ambrosus => need to burn it\\n\\n // we transfer tokens to network where token have sideTokenDecimals[sender] decimals\\n // convert amount with SIDE network decimals form to SELF decimals form\\n uint amount_this = _convertDecimals(amount, sideTokenDecimals[recipient], _decimals);\\n\\n\\n // user burn tokens; side bridge must have enough tokens to send\\n require(bridgeBalances[recipient] >= amount_this, \\\"not enough locked tokens on bridge\\\");\\n bridgeBalances[recipient] -= amount_this;\\n\\n _burn(sender, amount_this);\\n } else {\\n super._transfer(sender, recipient, amount);\\n }\\n }\\n\\n function _convertDecimals(uint256 amount, uint8 dFrom, uint8 dTo) internal pure returns (uint256) {\\n if (dTo == dFrom)\\n return amount;\\n if (dTo > dFrom)\\n return amount * (10 ** (dTo - dFrom));\\n else\\n return amount / (10 ** (dFrom - dTo));\\n }\\n\\n}\\n\",\"keccak256\":\"0xf2f414a753c0e2046491b76a7e7898f5f6820f62f2d6187d3fd061add6a17feb\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162001c6038038062001c608339810160408190526200003491620003fc565b8451859085906200004d9060039060208501906200022a565b508051620000639060049060208401906200022a565b5050506200009262000083620000c6640100000000026401000000009004565b640100000000620000ca810204565b620000a782826401000000006200011c810204565b50506008805460ff191660ff92909216919091179055506200068b9050565b3390565b60058054600160a060020a03838116600160a060020a0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80518251146200018c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206172726179206c656e6774687300000000000000000000000000604482015260640160405180910390fd5b60005b82518110156200022557818181518110620001ae57620001ae6200062d565b602002602001015160066000858481518110620001cf57620001cf6200062d565b6020026020010151600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806200021c90620005ea565b9150506200018f565b505050565b828054620002389062000594565b90600052602060002090601f0160209004810192826200025c5760008555620002a7565b82601f106200027757805160ff1916838001178555620002a7565b82800160010185558215620002a7579182015b82811115620002a75782518255916020019190600101906200028a565b50620002b5929150620002b9565b5090565b5b80821115620002b55760008155600101620002ba565b600082601f830112620002e257600080fd5b81516020620002fb620002f5836200056e565b6200053b565b82815281810190858301838502870184018810156200031957600080fd5b60005b8581101562000343576200033082620003e5565b845292840192908401906001016200031c565b5090979650505050505050565b600082601f8301126200036257600080fd5b81516001604060020a038111156200037e576200037e6200065c565b602062000394601f8301601f191682016200053b565b8281528582848701011115620003a957600080fd5b60005b83811015620003c9578581018301518282018401528201620003ac565b83811115620003db5760008385840101525b5095945050505050565b805160ff81168114620003f757600080fd5b919050565b600080600080600060a086880312156200041557600080fd5b85516001604060020a03808211156200042d57600080fd5b6200043b89838a0162000350565b96506020915081880151818111156200045357600080fd5b620004618a828b0162000350565b9650506200047260408901620003e5565b94506060880151818111156200048757600080fd5b8801601f81018a136200049957600080fd5b8051620004aa620002f5826200056e565b81815284810190838601868402850187018e1015620004c857600080fd5b600094505b8385101562000503578051600160a060020a0381168114620004ee57600080fd5b835260019490940193918601918601620004cd565b5060808c01519097509450505050808211156200051f57600080fd5b506200052e88828901620002d0565b9150509295509295909350565b604051601f8201601f191681016001604060020a03811182821017156200056657620005666200065c565b604052919050565b60006001604060020a038211156200058a576200058a6200065c565b5060209081020190565b600281046001821680620005a957607f821691505b60208210811415620005e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060001982141562000626577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115c5806200069b6000396000f3fe608060405234801561001057600080fd5b5060043610610128576000357c010000000000000000000000000000000000000000000000000000000090048063715018a6116100bf578063a9059cbb1161008e578063a9059cbb1461024f578063dc1ab98a14610262578063dd62ed3e14610282578063f2fde38b146102bb578063f590e1e6146102ce57600080fd5b8063715018a61461020f5780638da5cb5b1461021957806395d89b4114610234578063a457c2d71461023c57600080fd5b806323b872dd116100fb57806323b872dd146101b5578063313ce567146101c857806339509351146101d357806370a08231146101e657600080fd5b806306fdde031461012d578063095ea7b31461014b57806318160ddd1461016e5780631d836adf14610180575b600080fd5b6101356102e1565b6040516101429190611285565b60405180910390f35b61015e610159366004611197565b610373565b6040519015158152602001610142565b6002545b604051908152602001610142565b6101a361018e36600461110d565b60066020526000908152604090205460ff1681565b60405160ff9091168152602001610142565b61015e6101c336600461115b565b61038a565b60085460ff166101a3565b61015e6101e1366004611197565b6104e5565b6101726101f436600461110d565b600160a060020a031660009081526020819052604090205490565b610217610521565b005b600554604051600160a060020a039091168152602001610142565b61013561055a565b61015e61024a366004611197565b610569565b61015e61025d366004611197565b61061d565b61017261027036600461110d565b60076020526000908152604090205481565b610172610290366004611128565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b6102176102c936600461110d565b61062a565b6102176102dc3660046111c1565b6106e2565b6060600380546102f0906114eb565b80601f016020809104026020016040519081016040528092919081815260200182805461031c906114eb565b80156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b600061038033848461071d565b5060015b92915050565b600061039784848461087b565b600160a060020a03841660009081526006602052604090205460ff16156103ed57600160a060020a0384166000908152600660205260409020546008546103e691849160ff9182169116610a38565b915061043f565b600160a060020a03831660009081526006602052604090205460ff161561043f57600160a060020a03831660009081526006602052604090205460085461043c91849160ff9182169116610a38565b91505b600061044b8533610290565b9050828110156104cb5760405160e560020a62461bcd02815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104d8853385840361071d565b60019150505b9392505050565b336000818152600160209081526040808320600160a060020a0387168452909152812054909161038091859061051c908690611364565b61071d565b600554600160a060020a0316331461054e5760405160e560020a62461bcd0281526004016104c2906112da565b6105586000610aa2565b565b6060600480546102f0906114eb565b336000908152600160209081526040808320600160a060020a0386168452909152812054828110156106065760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104c2565b610613338585840361071d565b5060019392505050565b600061038033848461087b565b600554600160a060020a031633146106575760405160e560020a62461bcd0281526004016104c2906112da565b600160a060020a0381166106d65760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c2565b6106df81610aa2565b50565b600554600160a060020a0316331461070f5760405160e560020a62461bcd0281526004016104c2906112da565b6107198282610b01565b5050565b600160a060020a03831661079b5760405160e560020a62461bcd028152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03821661081a5760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600160a060020a03831660009081526006602052604090205460ff161561090d57600160a060020a0383166000908152600660205260408120546008546108ca91849160ff9182169116610a38565b600160a060020a0385166000908152600760205260408120805492935083929091906108f7908490611364565b9091555061090790508382610be4565b50505050565b600160a060020a03821660009081526006602052604090205460ff1615610a2857600160a060020a03821660009081526006602052604081205460085461095c91849160ff9182169116610a38565b600160a060020a0384166000908152600760205260409020549091508111156109f05760405160e560020a62461bcd02815260206004820152602260248201527f6e6f7420656e6f756768206c6f636b656420746f6b656e73206f6e206272696460448201527f676500000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03831660009081526007602052604081208054839290610a189084906114b1565b9091555061090790508482610cc6565b610a33838383610e51565b505050565b60008260ff168260ff161415610a4f5750826104de565b8260ff168260ff161115610a8357610a6783836114c8565b610a7290600a6113e6565b610a7c9085611492565b90506104de565b610a8d82846114c8565b610a9890600a6113e6565b610a7c908561137c565b60058054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8051825114610b555760405160e560020a62461bcd02815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064016104c2565b60005b8251811015610a3357818181518110610b7357610b7361155d565b602002602001015160066000858481518110610b9157610b9161155d565b6020026020010151600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610bdc90611529565b915050610b58565b600160a060020a038216610c3d5760405160e560020a62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c2565b8060026000828254610c4f9190611364565b9091555050600160a060020a03821660009081526020819052604081208054839290610c7c908490611364565b9091555050604051818152600160a060020a038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600160a060020a038216610d455760405160e560020a62461bcd02815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03821660009081526020819052604090205481811015610dd75760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a0383166000908152602081905260408120838303905560028054849290610e069084906114b1565b9091555050604051828152600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600160a060020a038316610ed05760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a038216610f4f5760405160e560020a62461bcd02815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03831660009081526020819052604090205481811015610fe15760405160e560020a62461bcd02815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03808516600090815260208190526040808220858503905591851681529081208054849290611018908490611364565b9250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161106491815260200190565b60405180910390a350505050565b8035600160a060020a038116811461108957600080fd5b919050565b600082601f83011261109f57600080fd5b813560206110b46110af83611340565b61130f565b82815281810190858301838502870184018810156110d157600080fd5b6000805b868110156110ff57823560ff811681146110ed578283fd5b855293850193918501916001016110d5565b509198975050505050505050565b60006020828403121561111f57600080fd5b6104de82611072565b6000806040838503121561113b57600080fd5b61114483611072565b915061115260208401611072565b90509250929050565b60008060006060848603121561117057600080fd5b61117984611072565b925061118760208501611072565b9150604084013590509250925092565b600080604083850312156111aa57600080fd5b6111b383611072565b946020939093013593505050565b600080604083850312156111d457600080fd5b823567ffffffffffffffff808211156111ec57600080fd5b818501915085601f83011261120057600080fd5b813560206112106110af83611340565b82815281810190858301838502870184018b101561122d57600080fd5b600096505b848710156112575761124381611072565b835260019690960195918301918301611232565b509650508601359250508082111561126e57600080fd5b5061127b8582860161108e565b9150509250929050565b600060208083528351808285015260005b818110156112b257858101830151858201604001528201611296565b818111156112c4576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561133857611338611576565b604052919050565b600067ffffffffffffffff82111561135a5761135a611576565b5060209081020190565b6000821982111561137757611377611544565b500190565b60008261139c5760e060020a634e487b7102600052601260045260246000fd5b500490565b600181815b808511156113de5781600019048211156113c2576113c2611544565b808516156113cf57918102915b600290940493908002906113a6565b509250929050565b60006104de60ff8416836000826113ff57506001610384565b8161140c57506000610384565b8160018114611422576002811461142c57611449565b6001915050610384565b60ff84111561143d5761143d611544565b8360020a915050610384565b5060208310610133831016604e8410600b841016171561146c575081810a610384565b61147683836113a1565b806000190482111561148a5761148a611544565b029392505050565b60008160001904831182151516156114ac576114ac611544565b500290565b6000828210156114c3576114c3611544565b500390565b600060ff821660ff8416808210156114e2576114e2611544565b90039392505050565b6002810460018216806114ff57607f821691505b602082108114156115235760e060020a634e487b7102600052602260045260246000fd5b50919050565b600060001982141561153d5761153d611544565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603260045260246000fd5b60e060020a634e487b7102600052604160045260246000fdfea26469706673582212208c84ff84563dca0a3e128ed404345f130db0415ba23e7368c16a212b29455baf64736f6c63430008060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610128576000357c010000000000000000000000000000000000000000000000000000000090048063715018a6116100bf578063a9059cbb1161008e578063a9059cbb1461024f578063dc1ab98a14610262578063dd62ed3e14610282578063f2fde38b146102bb578063f590e1e6146102ce57600080fd5b8063715018a61461020f5780638da5cb5b1461021957806395d89b4114610234578063a457c2d71461023c57600080fd5b806323b872dd116100fb57806323b872dd146101b5578063313ce567146101c857806339509351146101d357806370a08231146101e657600080fd5b806306fdde031461012d578063095ea7b31461014b57806318160ddd1461016e5780631d836adf14610180575b600080fd5b6101356102e1565b6040516101429190611285565b60405180910390f35b61015e610159366004611197565b610373565b6040519015158152602001610142565b6002545b604051908152602001610142565b6101a361018e36600461110d565b60066020526000908152604090205460ff1681565b60405160ff9091168152602001610142565b61015e6101c336600461115b565b61038a565b60085460ff166101a3565b61015e6101e1366004611197565b6104e5565b6101726101f436600461110d565b600160a060020a031660009081526020819052604090205490565b610217610521565b005b600554604051600160a060020a039091168152602001610142565b61013561055a565b61015e61024a366004611197565b610569565b61015e61025d366004611197565b61061d565b61017261027036600461110d565b60076020526000908152604090205481565b610172610290366004611128565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b6102176102c936600461110d565b61062a565b6102176102dc3660046111c1565b6106e2565b6060600380546102f0906114eb565b80601f016020809104026020016040519081016040528092919081815260200182805461031c906114eb565b80156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b600061038033848461071d565b5060015b92915050565b600061039784848461087b565b600160a060020a03841660009081526006602052604090205460ff16156103ed57600160a060020a0384166000908152600660205260409020546008546103e691849160ff9182169116610a38565b915061043f565b600160a060020a03831660009081526006602052604090205460ff161561043f57600160a060020a03831660009081526006602052604090205460085461043c91849160ff9182169116610a38565b91505b600061044b8533610290565b9050828110156104cb5760405160e560020a62461bcd02815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104d8853385840361071d565b60019150505b9392505050565b336000818152600160209081526040808320600160a060020a0387168452909152812054909161038091859061051c908690611364565b61071d565b600554600160a060020a0316331461054e5760405160e560020a62461bcd0281526004016104c2906112da565b6105586000610aa2565b565b6060600480546102f0906114eb565b336000908152600160209081526040808320600160a060020a0386168452909152812054828110156106065760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104c2565b610613338585840361071d565b5060019392505050565b600061038033848461087b565b600554600160a060020a031633146106575760405160e560020a62461bcd0281526004016104c2906112da565b600160a060020a0381166106d65760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c2565b6106df81610aa2565b50565b600554600160a060020a0316331461070f5760405160e560020a62461bcd0281526004016104c2906112da565b6107198282610b01565b5050565b600160a060020a03831661079b5760405160e560020a62461bcd028152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03821661081a5760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600160a060020a03831660009081526006602052604090205460ff161561090d57600160a060020a0383166000908152600660205260408120546008546108ca91849160ff9182169116610a38565b600160a060020a0385166000908152600760205260408120805492935083929091906108f7908490611364565b9091555061090790508382610be4565b50505050565b600160a060020a03821660009081526006602052604090205460ff1615610a2857600160a060020a03821660009081526006602052604081205460085461095c91849160ff9182169116610a38565b600160a060020a0384166000908152600760205260409020549091508111156109f05760405160e560020a62461bcd02815260206004820152602260248201527f6e6f7420656e6f756768206c6f636b656420746f6b656e73206f6e206272696460448201527f676500000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03831660009081526007602052604081208054839290610a189084906114b1565b9091555061090790508482610cc6565b610a33838383610e51565b505050565b60008260ff168260ff161415610a4f5750826104de565b8260ff168260ff161115610a8357610a6783836114c8565b610a7290600a6113e6565b610a7c9085611492565b90506104de565b610a8d82846114c8565b610a9890600a6113e6565b610a7c908561137c565b60058054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8051825114610b555760405160e560020a62461bcd02815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064016104c2565b60005b8251811015610a3357818181518110610b7357610b7361155d565b602002602001015160066000858481518110610b9157610b9161155d565b6020026020010151600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610bdc90611529565b915050610b58565b600160a060020a038216610c3d5760405160e560020a62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c2565b8060026000828254610c4f9190611364565b9091555050600160a060020a03821660009081526020819052604081208054839290610c7c908490611364565b9091555050604051818152600160a060020a038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600160a060020a038216610d455760405160e560020a62461bcd02815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03821660009081526020819052604090205481811015610dd75760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a0383166000908152602081905260408120838303905560028054849290610e069084906114b1565b9091555050604051828152600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600160a060020a038316610ed05760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a038216610f4f5760405160e560020a62461bcd02815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03831660009081526020819052604090205481811015610fe15760405160e560020a62461bcd02815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104c2565b600160a060020a03808516600090815260208190526040808220858503905591851681529081208054849290611018908490611364565b9250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161106491815260200190565b60405180910390a350505050565b8035600160a060020a038116811461108957600080fd5b919050565b600082601f83011261109f57600080fd5b813560206110b46110af83611340565b61130f565b82815281810190858301838502870184018810156110d157600080fd5b6000805b868110156110ff57823560ff811681146110ed578283fd5b855293850193918501916001016110d5565b509198975050505050505050565b60006020828403121561111f57600080fd5b6104de82611072565b6000806040838503121561113b57600080fd5b61114483611072565b915061115260208401611072565b90509250929050565b60008060006060848603121561117057600080fd5b61117984611072565b925061118760208501611072565b9150604084013590509250925092565b600080604083850312156111aa57600080fd5b6111b383611072565b946020939093013593505050565b600080604083850312156111d457600080fd5b823567ffffffffffffffff808211156111ec57600080fd5b818501915085601f83011261120057600080fd5b813560206112106110af83611340565b82815281810190858301838502870184018b101561122d57600080fd5b600096505b848710156112575761124381611072565b835260019690960195918301918301611232565b509650508601359250508082111561126e57600080fd5b5061127b8582860161108e565b9150509250929050565b600060208083528351808285015260005b818110156112b257858101830151858201604001528201611296565b818111156112c4576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561133857611338611576565b604052919050565b600067ffffffffffffffff82111561135a5761135a611576565b5060209081020190565b6000821982111561137757611377611544565b500190565b60008261139c5760e060020a634e487b7102600052601260045260246000fd5b500490565b600181815b808511156113de5781600019048211156113c2576113c2611544565b808516156113cf57918102915b600290940493908002906113a6565b509250929050565b60006104de60ff8416836000826113ff57506001610384565b8161140c57506000610384565b8160018114611422576002811461142c57611449565b6001915050610384565b60ff84111561143d5761143d611544565b8360020a915050610384565b5060208310610133831016604e8410600b841016171561146c575081810a610384565b61147683836113a1565b806000190482111561148a5761148a611544565b029392505050565b60008160001904831182151516156114ac576114ac611544565b500290565b6000828210156114c3576114c3611544565b500390565b600060ff821660ff8416808210156114e2576114e2611544565b90039392505050565b6002810460018216806114ff57607f821691505b602082108114156115235760e060020a634e487b7102600052602260045260246000fd5b50919050565b600060001982141561153d5761153d611544565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052603260045260246000fd5b60e060020a634e487b7102600052604160045260246000fdfea26469706673582212208c84ff84563dca0a3e128ed404345f130db0415ba23e7368c16a212b29455baf64736f6c63430008060033", "devdoc": { "kind": "dev", "methods": { @@ -516,7 +516,7 @@ "storageLayout": { "storage": [ { - "astId": 991, + "astId": 1371, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "_balances", "offset": 0, @@ -524,7 +524,7 @@ "type": "t_mapping(t_address,t_uint256)" }, { - "astId": 997, + "astId": 1377, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "_allowances", "offset": 0, @@ -532,7 +532,7 @@ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" }, { - "astId": 999, + "astId": 1379, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "_totalSupply", "offset": 0, @@ -540,7 +540,7 @@ "type": "t_uint256" }, { - "astId": 1001, + "astId": 1381, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "_name", "offset": 0, @@ -548,7 +548,7 @@ "type": "t_string_storage" }, { - "astId": 1003, + "astId": 1383, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "_symbol", "offset": 0, @@ -556,7 +556,7 @@ "type": "t_string_storage" }, { - "astId": 879, + "astId": 1259, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "_owner", "offset": 0, @@ -564,7 +564,7 @@ "type": "t_address" }, { - "astId": 9055, + "astId": 4869, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "sideTokenDecimals", "offset": 0, @@ -572,7 +572,7 @@ "type": "t_mapping(t_address,t_uint8)" }, { - "astId": 9059, + "astId": 4873, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "bridgeBalances", "offset": 0, @@ -580,7 +580,7 @@ "type": "t_mapping(t_address,t_uint256)" }, { - "astId": 9061, + "astId": 4875, "contract": "contracts/tokens/BridgeERC20_Amb.sol:BridgeERC20_Amb", "label": "_decimals", "offset": 0, diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index bde96a86..3ba5be4e 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -17,17 +17,18 @@ const config: HardhatUserConfig = { networks: { hardhat: { - blockGasLimit: 40000000, // amb value - hardfork: "byzantium", + // blockGasLimit: 40000000, // amb value + // hardfork: "byzantium", companionNetworks: {amb: 'hardhat'}, - initialDate: "13 May 2022 18:10:36 GMT", + // initialDate: "13 May 2022 18:10:36 GMT", // for debugging: run local node with state from some network forking: { - enabled: false, - url: "https://network.ambrosus-dev.io", + enabled: true, + url: "https://mainnet.infura.io/v3/" + process.env.INFURA_KEY, + // url: "https://network.ambrosus-dev.io", // url: "https://eth-rinkeby.alchemyapi.io/v2/e1F5R9XuWDU2-zCtzaMDg4Ybb5SuoEDA" - blockNumber: 0xb00ba, + blockNumber: 19218848, } }, @@ -152,7 +153,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 200, + runs: 500, }, // Note: for amb deploy evmVersion: "byzantium"