package eth import ( "fmt" "math/big" "net/http" "strconv" "strings" ethCommon "github.com/ethereum/go-ethereum/common" "golang.org/x/crypto/sha3" ) func addBlock(url string) { method := "POST" payload := strings.NewReader( "{\n \"jsonrpc\":\"2.0\",\n \"method\":\"evm_mine\",\n \"params\":[],\n \"id\":1\n}") client := &http.Client{} req, err := http.NewRequest(method, url, payload) if err != nil { fmt.Println(err) } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) } defer func() { if err := res.Body.Close(); err != nil { fmt.Println("Error when closing:", err) } }() } func addBlocks(numBlocks int64, url string) { for i := int64(0); i < numBlocks; i++ { addBlock(url) } } func addTime(seconds float64, url string) { secondsStr := strconv.FormatFloat(seconds, 'E', -1, 32) method := "POST" payload := strings.NewReader( "{\n \"jsonrpc\":\"2.0\",\n \"method\":\"evm_increaseTime\",\n \"params\":[" + secondsStr + "],\n \"id\":1\n}") client := &http.Client{} req, err := http.NewRequest(method, url, payload) if err != nil { fmt.Println(err) } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) } defer func() { if err := res.Body.Close(); err != nil { fmt.Println("Error when closing:", err) } }() } func createPermitDigest(tokenAddr, owner, spender ethCommon.Address, chainID, value, nonce, deadline *big.Int, tokenName string) ([]byte, error) { // NOTE: We ignore hash.Write errors because we are writing to a memory // buffer and don't expect any errors to occur. abiPermit := []byte("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") hashPermit := sha3.NewLegacyKeccak256() hashPermit.Write(abiPermit) //nolint:errcheck,gosec abiEIP712Domain := []byte("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") hashEIP712Domain := sha3.NewLegacyKeccak256() hashEIP712Domain.Write(abiEIP712Domain) //nolint:errcheck,gosec var encodeBytes []byte paddedHash := ethCommon.LeftPadBytes(hashEIP712Domain.Sum(nil), 32) hashName := sha3.NewLegacyKeccak256() hashName.Write([]byte(tokenName)) //nolint:errcheck,gosec paddedName := ethCommon.LeftPadBytes(hashName.Sum(nil), 32) hashVersion := sha3.NewLegacyKeccak256() hashVersion.Write([]byte("1")) //nolint:errcheck,gosec paddedX := ethCommon.LeftPadBytes(hashVersion.Sum(nil), 32) paddedChainID := ethCommon.LeftPadBytes(chainID.Bytes(), 32) paddedAddr := ethCommon.LeftPadBytes(tokenAddr.Bytes(), 32) encodeBytes = append(encodeBytes, paddedHash...) encodeBytes = append(encodeBytes, paddedName...) encodeBytes = append(encodeBytes, paddedX...) encodeBytes = append(encodeBytes, paddedChainID...) encodeBytes = append(encodeBytes, paddedAddr...) _domainSeparator := sha3.NewLegacyKeccak256() _domainSeparator.Write(encodeBytes) //nolint:errcheck,gosec var bytes1 []byte paddedHashPermit := ethCommon.LeftPadBytes(hashPermit.Sum(nil), 32) paddedOwner := ethCommon.LeftPadBytes(owner.Bytes(), 32) paddedSpender := ethCommon.LeftPadBytes(spender.Bytes(), 32) paddedValue := ethCommon.LeftPadBytes(value.Bytes(), 32) paddedNonce := ethCommon.LeftPadBytes(nonce.Bytes(), 32) paddedDeadline := ethCommon.LeftPadBytes(deadline.Bytes(), 32) bytes1 = append(bytes1, paddedHashPermit...) bytes1 = append(bytes1, paddedOwner...) bytes1 = append(bytes1, paddedSpender...) bytes1 = append(bytes1, paddedValue...) bytes1 = append(bytes1, paddedNonce...) bytes1 = append(bytes1, paddedDeadline...) hashBytes1 := sha3.NewLegacyKeccak256() hashBytes1.Write(bytes1) //nolint:errcheck,gosec var bytes2 []byte paddedY := ethCommon.LeftPadBytes([]byte{0x19}, 1) paddedZ := ethCommon.LeftPadBytes([]byte{0x01}, 1) paddedDomainSeparator := ethCommon.LeftPadBytes(_domainSeparator.Sum(nil), 32) paddedHashBytes1 := ethCommon.LeftPadBytes(hashBytes1.Sum(nil), 32) bytes2 = append(bytes2, paddedY...) bytes2 = append(bytes2, paddedZ...) bytes2 = append(bytes2, paddedDomainSeparator...) bytes2 = append(bytes2, paddedHashBytes1...) hashBytes2 := sha3.NewLegacyKeccak256() hashBytes2.Write(bytes2) //nolint:errcheck,gosec return hashBytes2.Sum(nil), nil } func createPermit(owner, spender ethCommon.Address, amount, deadline *big.Int, digest, signature []byte) []byte { r := signature[0:32] s := signature[32:64] v := signature[64] + byte(27) //nolint:gomnd ABIpermit := []byte("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)") hash := sha3.NewLegacyKeccak256() hash.Write(ABIpermit) //nolint:errcheck,gosec methodID := hash.Sum(nil)[:4] var permit []byte paddedOwner := ethCommon.LeftPadBytes(owner.Bytes(), 32) paddedSpender := ethCommon.LeftPadBytes(spender.Bytes(), 32) paddedAmount := ethCommon.LeftPadBytes(amount.Bytes(), 32) paddedDeadline := ethCommon.LeftPadBytes(deadline.Bytes(), 32) paddedV := ethCommon.LeftPadBytes([]byte{v}, 32) permit = append(permit, methodID...) permit = append(permit, paddedOwner...) permit = append(permit, paddedSpender...) permit = append(permit, paddedAmount...) permit = append(permit, paddedDeadline...) permit = append(permit, paddedV...) permit = append(permit, r...) permit = append(permit, s...) return permit }