Files
atomic-swap/ethereum/check_swap_creator_contract.go
2023-06-17 04:30:20 -05:00

51 lines
11 KiB
Go

// Copyright 2023 The AthanorLabs/atomic-swap Authors
// SPDX-License-Identifier: LGPL-3.0-only
package contracts
import (
"bytes"
"context"
"errors"
"fmt"
ethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
// expectedSwapCreatorBytecodeHex is generated by deploying an instance of
// SwapCreator.sol and reading back the bytecode. See the unit test
// TestExpectedSwapCreatorBytecodeHex if you need to update this value.
const (
expectedSwapCreatorBytecodeHex = "60806040526004361061006e575f3560e01c8063b32d1b4f1161004c578063b32d1b4f146100d1578063c41e46cf14610105578063eb84e7f214610126578063fcaf229c14610161575f80fd5b80631e6c5acc146100725780635cb969161461009357806387065c49146100b2575b5f80fd5b34801561007d575f80fd5b5061009161008c366004611040565b610180565b005b34801561009e575f80fd5b506100916100ad366004611040565b610362565b3480156100bd575f80fd5b506100916100cc36600461108e565b610425565b3480156100dc575f80fd5b506100f06100eb366004611146565b610688565b60405190151581526020015b60405180910390f35b610118610113366004611166565b610754565b6040519081526020016100fc565b348015610131575f80fd5b506101546101403660046111d2565b5f6020819052908152604090205460ff1681565b6040516100fc91906111fd565b34801561016c575f80fd5b5061009161017b366004611223565b6109cc565b5f8260405160200161019291906112ad565b60408051601f1981840301815291815281516020928301205f818152928390529082205490925060ff16908160038111156101cf576101cf6111e9565b036101ed57604051631115766760e01b815260040160405180910390fd5b6003816003811115610201576102016111e9565b0361021f5760405163066916a960e01b815260040160405180910390fd5b83516001600160a01b031633146102495760405163148ca24360e11b815260040160405180910390fd5b8360a001514210801561027a5750836080015142118061027a57506002816003811115610278576102786111e9565b145b15610298576040516332a1860f60e11b815260040160405180910390fd5b6102a6838560600151610aa7565b604051839083907e7c875846b687732a7579c19bb1dade66cd14e9f4f809565e2b2b5e76c72b4f905f90a35f828152602081905260409020805460ff1916600317905560c08401516001600160a01b031661033b57835160e08501516040516001600160a01b039092169181156108fc0291905f818181858888f19350505050158015610335573d5f803e3d5ffd5b5061035c565b835160e085015160c086015161035c926001600160a01b0390911691610ace565b50505050565b81602001516001600160a01b0316336001600160a01b03161461039857604051633471640960e11b815260040160405180910390fd5b6103a28282610b31565b60c08201516001600160a01b03166103f75781602001516001600160a01b03166108fc8360e0015190811502906040515f60405180830381858888f193505050501580156103f2573d5f803e3d5ffd5b505050565b61042182602001518360e001518460c001516001600160a01b0316610ace9092919063ffffffff16565b5050565b5f60018860405160200161043991906112bc565b60408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610494573d5f803e3d5ffd5b505050602060405103519050875f0151602001516001600160a01b0316816001600160a01b0316146104d957604051638baa579f60e01b815260040160405180910390fd5b87606001516001600160a01b0316306001600160a01b03161461050f5760405163a710429d60e01b815260040160405180910390fd5b60408089015190516bffffffffffffffffffffffff19606089901b1660208201526001600160e01b031960e088901b166034820152603801604051602081830303815290604052805190602001201461057b5760405163fe16c3c560e01b815260040160405180910390fd5b87516105879088610b31565b875160c001516001600160a01b031661062757875f0151602001516001600160a01b03166108fc89602001518a5f015160e001516105c59190611312565b6040518115909202915f818181858888f193505050501580156105ea573d5f803e3d5ffd5b5060208801516040516001600160a01b0388169180156108fc02915f818181858888f19350505050158015610621573d5f803e3d5ffd5b5061067e565b8751602080820151908a015160e09092015161065c9261064691611312565b8a5160c001516001600160a01b03169190610ace565b6020880151885160c0015161067e916001600160a01b03909116908890610ace565b5050505050505050565b5f80600181601b7f79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179870014551231950b75fc4402da1732fc9bebe197f79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817988909604080515f8152602081018083529590955260ff909316928401929092526060830152608082015260a0016020604051602081039080840390855afa158015610731573d5f803e3d5ffd5b5050604051601f1901516001600160a01b03858116911614925050505b92915050565b5f825f0361077557604051637c946ed760e01b815260040160405180910390fd5b6001600160a01b0384166107a8573483146107a357604051632a9ffab760e21b815260040160405180910390fd5b6107bd565b6107bd6001600160a01b038516333086610c8e565b8815806107c8575087155b156107e657604051631bc61bed60e11b815260040160405180910390fd5b6001600160a01b03871661080c576040516208978560e71b815260040160405180910390fd5b851580610817575084155b1561083557604051631ffb86f160e21b815260040160405180910390fd5b5f604051806101200160405280336001600160a01b03168152602001896001600160a01b031681526020018b81526020018a815260200188426108789190611325565b8152602001876108888a42611325565b6108929190611325565b8152602001866001600160a01b031681526020018581526020018481525090505f816040516020016108c491906112ad565b60408051601f19818403018152919052805160209091012090505f808281526020819052604090205460ff166003811115610901576109016111e9565b1461091f576040516339a2986760e11b815260040160405180910390fd5b7f91446ce035ac29998b5473504609a5ef5e961005daba4630a1684b63be848f56818c8c85608001518660a001518760c001518860e0015160405161099e979695949392919096875260208701959095526040860193909352606085019190915260808401526001600160a01b031660a083015260c082015260e00190565b60405180910390a15f818152602081905260409020805460ff191660011790559a9950505050505050505050565b5f816040516020016109de91906112ad565b60408051601f198184030181529190528051602090910120905060015f8281526020819052604090205460ff166003811115610a1c57610a1c6111e9565b14610a3a57604051630fe0fb5160e11b815260040160405180910390fd5b81516001600160a01b03163314610a645760405163148ca24360e11b815260040160405180910390fd5b5f81815260208190526040808220805460ff191660021790555182917f5fc23b25552757626e08b316cc2387ad1bc70ee1594af7204db4ce0c39f5d15f91a25050565b610ab18282610688565b6104215760405163abab6bd760e01b815260040160405180910390fd5b6040516001600160a01b0383166024820152604481018290526103f290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610cc6565b5f82604051602001610b4391906112ad565b60408051601f1981840301815291815281516020928301205f818152928390529082205490925060ff1690816003811115610b8057610b806111e9565b03610b9e57604051631115766760e01b815260040160405180910390fd5b6003816003811115610bb257610bb26111e9565b03610bd05760405163066916a960e01b815260040160405180910390fd5b836080015142108015610bf557506002816003811115610bf257610bf26111e9565b14155b15610c135760405163d71d60b560e01b815260040160405180910390fd5b8360a001514210610c375760405163497df9d160e01b815260040160405180910390fd5b610c45838560400151610aa7565b604051839083907f38d6042dbdae8e73a7f6afbabd3fbe0873f9f5ed3cd71294591c3908c2e65fee905f90a3505f908152602081905260409020805460ff191660031790555050565b6040516001600160a01b038085166024830152831660448201526064810182905261035c9085906323b872dd60e01b90608401610afa565b5f610d1a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610d9e9092919063ffffffff16565b905080515f1480610d3a575080806020019051810190610d3a9190611338565b6103f25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084015b60405180910390fd5b6060610dac84845f85610db4565b949350505050565b606082471015610e155760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d95565b5f80866001600160a01b03168587604051610e309190611379565b5f6040518083038185875af1925050503d805f8114610e6a576040519150601f19603f3d011682016040523d82523d5f602084013e610e6f565b606091505b5091509150610e8087838387610e8b565b979650505050505050565b60608315610ef95782515f03610ef2576001600160a01b0385163b610ef25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d95565b5081610dac565b610dac8383815115610f0e5781518083602001fd5b8060405162461bcd60e51b8152600401610d959190611394565b604051610120810167ffffffffffffffff81118282101715610f5857634e487b7160e01b5f52604160045260245ffd5b60405290565b6040516080810167ffffffffffffffff81118282101715610f5857634e487b7160e01b5f52604160045260245ffd5b6001600160a01b0381168114610fa1575f80fd5b50565b8035610faf81610f8d565b919050565b5f6101208284031215610fc5575f80fd5b610fcd610f28565b9050610fd882610fa4565b8152610fe660208301610fa4565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015261101f60c08301610fa4565b60c082015260e082013560e082015261010080830135818301525092915050565b5f806101408385031215611052575f80fd5b61105c8484610fb4565b94610120939093013593505050565b803563ffffffff81168114610faf575f80fd5b803560ff81168114610faf575f80fd5b5f805f805f805f8789036102408112156110a6575f80fd5b610180808212156110b5575f80fd5b6110bd610f5e565b91506110c98b8b610fb4565b82526101208a013560208301526101408a013560408301526101608a01356110f081610f8d565b6060830152909750880135955061110a6101a08901610fa4565b94506111196101c0890161106b565b93506111286101e0890161107e565b92506102008801359150610220880135905092959891949750929550565b5f8060408385031215611157575f80fd5b50508035926020909101359150565b5f805f805f805f80610100898b03121561117e575f80fd5b8835975060208901359650604089013561119781610f8d565b9550606089013594506080890135935060a08901356111b581610f8d565b979a969950949793969295929450505060c08201359160e0013590565b5f602082840312156111e2575f80fd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061121d57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f6101208284031215611234575f80fd5b61123e8383610fb4565b9392505050565b60018060a01b0380825116835280602083015116602084015260408201516040840152606082015160608401526080820151608084015260a082015160a08401528060c08301511660c08401525060e081015160e08301526101008082015181840152505050565b610120810161074e8284611245565b5f610180820190506112cf828451611245565b602083015161012083015260408301516101408301526060909201516001600160a01b03166101609091015290565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561074e5761074e6112fe565b8082018082111561074e5761074e6112fe565b5f60208284031215611348575f80fd5b8151801515811461123e575f80fd5b5f5b83811015611371578181015183820152602001611359565b50505f910152565b5f825161138a818460208701611357565b9190910192915050565b602081525f82518060208401526113b2816040850160208701611357565b601f01601f1916919091016040019291505056fea264697066735822122058723d6f94b6ae0fd67bfece90eee43db933ef07d0eecef13276b9cf2f7a7b7e64736f6c63430008140033" //nolint:lll
)
var (
errInvalidSwapCreatorContract = errors.New("given contract address does not contain correct SwapCreator code")
)
// CheckSwapCreatorContractCode checks that the bytecode at the given address
// matches the SwapCreator.sol contract.
func CheckSwapCreatorContractCode(
ctx context.Context,
ec *ethclient.Client,
contractAddr ethcommon.Address,
) error {
code, err := ec.CodeAt(ctx, contractAddr, nil)
if err != nil {
return fmt.Errorf("failed to get code at %s: %w", contractAddr, err)
}
expectedCode := ethcommon.FromHex(expectedSwapCreatorBytecodeHex)
if len(code) != len(expectedCode) {
return fmt.Errorf("length mismatch: %w", errInvalidSwapCreatorContract)
}
if !bytes.Equal(expectedCode, code) {
return errInvalidSwapCreatorContract
}
return nil
}