| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of the go-ethereum library. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package abi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | // Method represents a callable given a `Name` and whether the method is a constant. | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | // If the method is `Const` no transaction needs to be created for this | 
					
						
							|  |  |  | // particular Method call. It can easily be simulated using a local VM. | 
					
						
							|  |  |  | // For example a `Balance()` method only needs to retrieve something | 
					
						
							|  |  |  | // from the storage and therefor requires no Tx to be send to the | 
					
						
							|  |  |  | // network. A method such as `Transact` does require a Tx and thus will | 
					
						
							|  |  |  | // be flagged `true`. | 
					
						
							|  |  |  | // Input specifies the required input parameters for this gives method. | 
					
						
							|  |  |  | type Method struct { | 
					
						
							|  |  |  | 	Name    string | 
					
						
							|  |  |  | 	Const   bool | 
					
						
							| 
									
										
										
										
											2017-12-21 10:26:30 +01:00
										 |  |  | 	Inputs  Arguments | 
					
						
							|  |  |  | 	Outputs Arguments | 
					
						
							| 
									
										
										
										
											2017-10-17 06:07:08 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | // Sig returns the methods string signature according to the ABI spec. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Example | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | //     function foo(uint32 a, int b)    =    "foo(uint32,int256)" | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Please note that "int" is substitute for its canonical representation "int256" | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | func (method Method) Sig() string { | 
					
						
							|  |  |  | 	types := make([]string, len(method.Inputs)) | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | 	i := 0 | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | 	for _, input := range method.Inputs { | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | 		types[i] = input.Type.String() | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | 	return fmt.Sprintf("%v(%v)", method.Name, strings.Join(types, ",")) | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | func (method Method) String() string { | 
					
						
							|  |  |  | 	inputs := make([]string, len(method.Inputs)) | 
					
						
							|  |  |  | 	for i, input := range method.Inputs { | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | 		inputs[i] = fmt.Sprintf("%v %v", input.Name, input.Type) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | 	outputs := make([]string, len(method.Outputs)) | 
					
						
							|  |  |  | 	for i, output := range method.Outputs { | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | 		if len(output.Name) > 0 { | 
					
						
							|  |  |  | 			outputs[i] = fmt.Sprintf("%v ", output.Name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		outputs[i] += output.Type.String() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-03-16 11:19:25 +02:00
										 |  |  | 	constant := "" | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | 	if method.Const { | 
					
						
							| 
									
										
										
										
											2016-03-16 11:19:25 +02:00
										 |  |  | 		constant = "constant " | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | 	return fmt.Sprintf("function %v(%v) %sreturns(%v)", method.Name, strings.Join(inputs, ", "), constant, strings.Join(outputs, ", ")) | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-10 02:48:51 +01:00
										 |  |  | func (method Method) Id() []byte { | 
					
						
							|  |  |  | 	return crypto.Keccak256([]byte(method.Sig()))[:4] | 
					
						
							| 
									
										
										
										
											2015-11-20 13:45:37 +01:00
										 |  |  | } |