This PR moves (some) account types into a standalone package, to avoid depending on signer/core from accounts/external.
		
			
				
	
	
		
			94 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package core
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"math/big"
 | |
| 
 | |
| 	"github.com/ethereum/go-ethereum/common"
 | |
| 	"github.com/ethereum/go-ethereum/common/hexutil"
 | |
| 	"github.com/ethereum/go-ethereum/common/math"
 | |
| 	"github.com/ethereum/go-ethereum/signer/core/apitypes"
 | |
| )
 | |
| 
 | |
| // GnosisSafeTx is a type to parse the safe-tx returned by the relayer,
 | |
| // it also conforms to the API required by the Gnosis Safe tx relay service.
 | |
| // See 'SafeMultisigTransaction' on https://safe-transaction.mainnet.gnosis.io/
 | |
| type GnosisSafeTx struct {
 | |
| 	// These fields are only used on output
 | |
| 	Signature  hexutil.Bytes           `json:"signature"`
 | |
| 	SafeTxHash common.Hash             `json:"contractTransactionHash"`
 | |
| 	Sender     common.MixedcaseAddress `json:"sender"`
 | |
| 	// These fields are used both on input and output
 | |
| 	Safe           common.MixedcaseAddress `json:"safe"`
 | |
| 	To             common.MixedcaseAddress `json:"to"`
 | |
| 	Value          math.Decimal256         `json:"value"`
 | |
| 	GasPrice       math.Decimal256         `json:"gasPrice"`
 | |
| 	Data           *hexutil.Bytes          `json:"data"`
 | |
| 	Operation      uint8                   `json:"operation"`
 | |
| 	GasToken       common.Address          `json:"gasToken"`
 | |
| 	RefundReceiver common.Address          `json:"refundReceiver"`
 | |
| 	BaseGas        big.Int                 `json:"baseGas"`
 | |
| 	SafeTxGas      big.Int                 `json:"safeTxGas"`
 | |
| 	Nonce          big.Int                 `json:"nonce"`
 | |
| 	InputExpHash   common.Hash             `json:"safeTxHash"`
 | |
| }
 | |
| 
 | |
| // ToTypedData converts the tx to a EIP-712 Typed Data structure for signing
 | |
| func (tx *GnosisSafeTx) ToTypedData() TypedData {
 | |
| 	var data hexutil.Bytes
 | |
| 	if tx.Data != nil {
 | |
| 		data = *tx.Data
 | |
| 	}
 | |
| 	gnosisTypedData := TypedData{
 | |
| 		Types: Types{
 | |
| 			"EIP712Domain": []Type{{Name: "verifyingContract", Type: "address"}},
 | |
| 			"SafeTx": []Type{
 | |
| 				{Name: "to", Type: "address"},
 | |
| 				{Name: "value", Type: "uint256"},
 | |
| 				{Name: "data", Type: "bytes"},
 | |
| 				{Name: "operation", Type: "uint8"},
 | |
| 				{Name: "safeTxGas", Type: "uint256"},
 | |
| 				{Name: "baseGas", Type: "uint256"},
 | |
| 				{Name: "gasPrice", Type: "uint256"},
 | |
| 				{Name: "gasToken", Type: "address"},
 | |
| 				{Name: "refundReceiver", Type: "address"},
 | |
| 				{Name: "nonce", Type: "uint256"},
 | |
| 			},
 | |
| 		},
 | |
| 		Domain: TypedDataDomain{
 | |
| 			VerifyingContract: tx.Safe.Address().Hex(),
 | |
| 		},
 | |
| 		PrimaryType: "SafeTx",
 | |
| 		Message: TypedDataMessage{
 | |
| 			"to":             tx.To.Address().Hex(),
 | |
| 			"value":          tx.Value.String(),
 | |
| 			"data":           data,
 | |
| 			"operation":      fmt.Sprintf("%d", tx.Operation),
 | |
| 			"safeTxGas":      fmt.Sprintf("%#d", &tx.SafeTxGas),
 | |
| 			"baseGas":        fmt.Sprintf("%#d", &tx.BaseGas),
 | |
| 			"gasPrice":       tx.GasPrice.String(),
 | |
| 			"gasToken":       tx.GasToken.Hex(),
 | |
| 			"refundReceiver": tx.RefundReceiver.Hex(),
 | |
| 			"nonce":          fmt.Sprintf("%d", tx.Nonce.Uint64()),
 | |
| 		},
 | |
| 	}
 | |
| 	return gnosisTypedData
 | |
| }
 | |
| 
 | |
| // ArgsForValidation returns a SendTxArgs struct, which can be used for the
 | |
| // common validations, e.g. look up 4byte destinations
 | |
| func (tx *GnosisSafeTx) ArgsForValidation() *apitypes.SendTxArgs {
 | |
| 	gp := hexutil.Big(tx.GasPrice)
 | |
| 	args := &apitypes.SendTxArgs{
 | |
| 		From:     tx.Safe,
 | |
| 		To:       &tx.To,
 | |
| 		Gas:      hexutil.Uint64(tx.SafeTxGas.Uint64()),
 | |
| 		GasPrice: &gp,
 | |
| 		Value:    hexutil.Big(tx.Value),
 | |
| 		Nonce:    hexutil.Uint64(tx.Nonce.Uint64()),
 | |
| 		Data:     tx.Data,
 | |
| 		Input:    nil,
 | |
| 	}
 | |
| 	return args
 | |
| }
 |