Ejemplo n.º 1
0
        public async void ShouldBeAbleToEncodeTheSameAsTheSmartContract()
        {
            var web3              = _ethereumClientIntegrationFixture.GetInfuraWeb3(InfuraNetwork.Rinkeby);
            var signer            = new Eip712TypedDataSigner();
            var gnosisSafeAddress = "0xa9C09412C1d93DAc6eE9254A51E97454588D3B88";
            var chainId           = (int)Chain.Rinkeby;
            var service           = new GnosisSafeService(web3, gnosisSafeAddress);
            var param             = new EncodeTransactionDataFunction
            {
                To             = "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D",
                Value          = 0,
                Data           = "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D".HexToByteArray(),
                Operation      = (byte)ContractOperationType.Call,
                SafeTxGas      = 0,
                BaseGas        = 0,
                GasPrice       = 0,
                GasToken       = AddressUtil.AddressEmptyAsHex,
                RefundReceiver = AddressUtil.AddressEmptyAsHex,
                Nonce          = 1
            };
            var encoded = await service.EncodeTransactionDataQueryAsync(param);

            var domain = new Domain
            {
                VerifyingContract = gnosisSafeAddress,
                ChainId           = chainId
            };

            var encodedMessage = signer.EncodeTypedData(param, domain, "SafeTx");

            Assert.Equal(encoded.ToHex(), encodedMessage.ToHex());
        }
Ejemplo n.º 2
0
        public async Task <ExecTransactionFunction> BuildTransactionAsync(
            EncodeTransactionDataFunction transactionData,
            BigInteger chainId,
            bool estimateSafeTxGas = false, params string[] privateKeySigners)
        {
            var nonce = await NonceQueryAsync().ConfigureAwait(false);

            transactionData.SafeNonce = nonce;

            return(BuildTransaction(transactionData, chainId, privateKeySigners));
        }
Ejemplo n.º 3
0
        public Task <ExecTransactionFunction> BuildMultiSendTransactionAsync(
            EncodeTransactionDataFunction transactionData,
            BigInteger chainId,
            string[] privateKeySigners,
            bool estimateSafeTxGas = false, params IMultiSendInput[] multiSendInputs)
        {
            transactionData.Operation = (int)ContractOperationType.DelegateCall;
            var multiSendFunction = new MultiSendFunction(multiSendInputs);

            return(BuildTransactionAsync(transactionData, multiSendFunction, chainId, estimateSafeTxGas,
                                         privateKeySigners));
        }
        public void FlatMessageObjectEncodingShouldBeCorrect()
        {
            var domain = new MyFlatDomain()
            {
                VerifyingContract = "0x0fced4cc7788ede6d93e23e0b54bb56a98114ce2"
            };

            var param = new EncodeTransactionDataFunction
            {
                To             = "0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa",
                Value          = 0,
                Data           = "0x095ea7b3000000000000000000000000e7bc397dbd069fc7d0109c0636d06888bb50668c00000000000000000000000000000000000000000000000000000000ffffffff".HexToByteArray(),
                Operation      = 0,
                SafeTxGas      = 0,
                BaseGas        = 0,
                GasPrice       = 0,
                GasToken       = AddressUtil.AddressEmptyAsHex,
                RefundReceiver = AddressUtil.AddressEmptyAsHex,
                Nonce          = 1
            };

            var encodedMessage = _signer.EncodeTypedData(param, domain, "SafeTx");

            Assert.Equal(
                encodedMessage.ToHex(true),
                "0x1901a15700103df744480601949aa3add5a0c0ebf6d258bf881eb6abac9736ead7f43a707a87afefa511211636c16608979d6ce2fc81e3c6979d4b80fb4bf3ff1080",
                ignoreCase: true
                );

            var testPrivateKey = "8da4ef21b864d2cc526dbdb2a120bd2874c36c9d0a1fb7f8c63d7f7a8b41de8f";
            var signature      = _signer.SignTypedData(param, domain, "SafeTx", new EthECKey(testPrivateKey));

            Assert.Equal(
                signature,
                "0x12bc2897d54cf62b8cc4864f02e6e154ddf416e51b5919a608e32978fa80422e369a3d6b24eeb2875e3fabc233b4ebbd8306c209a81958c440172780ad9a99841c",
                ignoreCase: true
                );

            var recoveredAddress = new EthereumMessageSigner().EcRecover(Sha3Keccack.Current.CalculateHash(encodedMessage), signature);

            Assert.Equal(
                recoveredAddress,
                "0x63FaC9201494f0bd17B9892B9fae4d52fe3BD377",
                ignoreCase: true
                );
        }
Ejemplo n.º 5
0
        public Task <byte[]> EncodeTransactionDataQueryAsync(string to, BigInteger value, byte[] data, byte operation, BigInteger safeTxGas, BigInteger baseGas, BigInteger gasPrice, string gasToken, string refundReceiver, BigInteger nonce, BlockParameter blockParameter = null)
        {
            var encodeTransactionDataFunction = new EncodeTransactionDataFunction();

            encodeTransactionDataFunction.To             = to;
            encodeTransactionDataFunction.Value          = value;
            encodeTransactionDataFunction.Data           = data;
            encodeTransactionDataFunction.Operation      = operation;
            encodeTransactionDataFunction.SafeTxGas      = safeTxGas;
            encodeTransactionDataFunction.BaseGas        = baseGas;
            encodeTransactionDataFunction.GasPrice       = gasPrice;
            encodeTransactionDataFunction.GasToken       = gasToken;
            encodeTransactionDataFunction.RefundReceiver = refundReceiver;
            encodeTransactionDataFunction.Nonce          = nonce;

            return(ContractHandler.QueryAsync <EncodeTransactionDataFunction, byte[]>(encodeTransactionDataFunction, blockParameter));
        }
Ejemplo n.º 6
0
        public ExecTransactionFunction BuildTransaction(
            EncodeTransactionDataFunction transactionData,
            BigInteger chainId,
            params string[] privateKeySigners)
        {
            var signer        = new Eip712TypedDataSigner();
            var messageSigner = new MessageSigner();

            var domain = new Domain
            {
                VerifyingContract = this.ContractHandler.ContractAddress,
                ChainId           = chainId
            };

            var encodedMessage = signer.EncodeTypedData(transactionData, domain, "SafeTx");
            var hashEncoded    = Util.Sha3Keccack.Current.CalculateHash(encodedMessage);
            var signatures     = new List <SafeSignature>();

            foreach (var privateKey in privateKeySigners)
            {
                var publicAddress = EthECKey.GetPublicAddress(privateKey);
                var signature     = messageSigner.Sign(hashEncoded, privateKey);
                signatures.Add(new SafeSignature()
                {
                    Address = publicAddress, Signature = signature
                });
            }

            var fullSignature = GetCombinedSignaturesInOrder(signatures);

            return(new ExecTransactionFunction()
            {
                To = transactionData.To,
                Value = transactionData.Value,
                Data = transactionData.Data,
                Operation = transactionData.Operation,
                SafeTxGas = transactionData.SafeTxGas,
                BaseGas = transactionData.BaseGas,
                SafeGasPrice = transactionData.SafeGasPrice,
                GasToken = transactionData.GasToken,
                RefundReceiver = transactionData.RefundReceiver,
                Signatures = fullSignature
            });
        }
Ejemplo n.º 7
0
        public async Task <ExecTransactionFunction> BuildTransactionAsync <TFunctionMessage>(
            EncodeTransactionDataFunction transactionData,
            TFunctionMessage functionMessage,
            BigInteger chainId,
            bool estimateSafeTxGas = false, params string[] privateKeySigners) where TFunctionMessage : FunctionMessage, new()
        {
            var nonce = await NonceQueryAsync().ConfigureAwait(false);;

            if (estimateSafeTxGas)
            {
                var toContract      = transactionData.To;
                var estimateHandler = Web3.Eth.GetContractTransactionHandler <TFunctionMessage>();
                functionMessage.FromAddress = this.ContractHandler.ContractAddress;
                var gasEstimateSafe = await estimateHandler.EstimateGasAsync(toContract, functionMessage).ConfigureAwait(false);;
                transactionData.SafeTxGas = gasEstimateSafe;
            }

            transactionData.Data      = functionMessage.GetCallData();
            transactionData.SafeNonce = nonce;

            return(BuildTransaction(transactionData, chainId, privateKeySigners));
        }
Ejemplo n.º 8
0
        public ExecTransactionFunction BuildTransaction(
            EncodeTransactionDataFunction transactionData,
            BigInteger chainId,
            params string[] privateKeySigners)
        {
            var signer        = new Eip712TypedDataSigner();
            var messageSigner = new MessageSigner();

            var typedDefinition = GetGnosisSafeTypedDefinition(chainId, this.ContractHandler.ContractAddress);

            var hashEncoded = signer.EncodeAndHashTypedData(transactionData, typedDefinition);
            var signatures  = new List <SafeSignature>();

            foreach (var privateKey in privateKeySigners)
            {
                var publicAddress = EthECKey.GetPublicAddress(privateKey);
                var signature     = messageSigner.Sign(hashEncoded, privateKey);
                signatures.Add(new SafeSignature()
                {
                    Address = publicAddress, Signature = signature
                });
            }

            var fullSignature = GetCombinedSignaturesInOrder(signatures);

            return(new ExecTransactionFunction()
            {
                To = transactionData.To,
                Value = transactionData.Value,
                Data = transactionData.Data,
                Operation = transactionData.Operation,
                SafeTxGas = transactionData.SafeTxGas,
                BaseGas = transactionData.BaseGas,
                SafeGasPrice = transactionData.SafeGasPrice,
                GasToken = transactionData.GasToken,
                RefundReceiver = transactionData.RefundReceiver,
                Signatures = fullSignature
            });
        }
Ejemplo n.º 9
0
 public Task <byte[]> EncodeTransactionDataQueryAsync(EncodeTransactionDataFunction encodeTransactionDataFunction, BlockParameter blockParameter = null)
 {
     return(ContractHandler.QueryAsync <EncodeTransactionDataFunction, byte[]>(encodeTransactionDataFunction, blockParameter));
 }