Skip to content

Instantly share code, notes, and snippets.

@cawfree
Created August 25, 2020 17:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cawfree/772993501f2619a4bd26c6cfdbec7a01 to your computer and use it in GitHub Desktop.
Save cawfree/772993501f2619a4bd26c6cfdbec7a01 to your computer and use it in GitHub Desktop.
Failed signature generation for Gnosis Safe (Snippet)
import EIP712Domain from "eth-typed-data";
import { SimpleSigner } from "did-jwt";
import { ethers } from "ethers";
import {
useGnosisApi,
useIsGnosisSafeDeployed,
useGnosisEstimateTransaction,
} from "../../session";
const { utils } = ethers;
try {
const { safe } = gnosisSafe;
// https://github.com/gnosis/safe-demo/blob/master/scripts/demo.js
const { publicAddress, privateKey } = myWallet;
console.log({ publicAddress});
const isDeployed = await isGnosisSafeDeployed({ safe });
if (!isDeployed) {
throw new Error(`The gnosisSafe at address ${safe} has not been initialized with a payment of ${gnosisSafe.payment}wei.`);
}
// Taken from: https://github.com/gnosis/safe-demo/blob/master/scripts/demo.js
const GnosisWalletRequest = EIP712Domain.fromSignatureRequest(
{
types: {
EIP712Domain: [
{ type: "address", name: "verifyingContract" }
],
SafeTx: [
{ type: "address", name: "to" },
{ type: "uint256", name: "value" },
{ type: "bytes", name: "data" },
{ type: "uint8", name: "operation" },
{ type: "uint256", name: "safeTxGas" },
{ type: "uint256", name: "dataGas" },
{ type: "uint256", name: "gasPrice" },
{ type: "address", name: "gasToken" },
{ type: "address", name: "refundReceiver" },
{ type: "uint256", name: "nonce" },
]
},
domain: {
verifyingContract: "0x39cBD3814757Be997040E51921e8D54618278A08",
},
primaryType: "SafeTx",
message: {
to: "0x39cBD3814757Be997040E51921e8D54618278A08",
value: "10000000000000000",
data: "0x",
operation: "0",
safeTxGas: "42671",
dataGas: "40660",
gasPrice: "10000000000",
gasToken: "0x0000000000000000000000000000000000000000",
refundReceiver: "0x0000000000000000000000000000000000000000",
nonce: "0"
}
},
);
const { SafeTx } = GnosisWalletRequest.domain.types;
const to = utils.getAddress("0x3cb0660b9419b06521aed844ad6d5a7b355bd055");
const baseTxn = {
to,
value: "1000",
data: "0x",
nonce: "0",
operation: "0",
};
const { safeTxGas, dataGas, gasPrice, gasToken, refundReceiver } = await gnosisEstimateTransaction(
safe,
baseTxn,
);
const txn = {
...baseTxn,
safeTxGas,
dataGas,
gasPrice,
gasToken,
refundReceiver,
};
const safeTx = new SafeTx(txn);
const signer = new SimpleSigner(`${privateKey}`);
const { r, s, recoveryParam: v } = await safeTx.sign(signer);
const signature = {
r: new BigNumber(`0x${r}`, 16).toString(10),
s: new BigNumber(`0x${s}`, 16).toString(10),
v,
};
const { data: x } = await gnosis({
url: `/v1/safes/${safe}/transactions/`,
method: "post",
data: {
...txn,
signatures: [signature],
},
}); // Throws: "InvalidOwners: ('Signers=%s are not valid owners of the safe...)"
} catch (e) {
console.error(e);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment