Skip to content

Commit

Permalink
Merge 57fd637 into 6fe4306
Browse files Browse the repository at this point in the history
  • Loading branch information
fleupold committed Aug 13, 2023
2 parents 6fe4306 + 57fd637 commit ae62a63
Show file tree
Hide file tree
Showing 5 changed files with 539 additions and 25 deletions.
7 changes: 6 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,5 +86,10 @@
"lib/",
"networks.json",
"src/"
]
],
"dependencies": {
"@safe-global/api-kit": "^1.3.0",
"@safe-global/protocol-kit": "^1.2.0",
"@safe-global/safe-core-sdk-types": "^2.2.0"
}
}
36 changes: 30 additions & 6 deletions src/tasks/selfSell.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,13 @@ import {
} from "./ts/value";
import { BalanceOutput, getAmounts } from "./withdraw";
import { ignoredTokenMessage } from "./withdraw/messages";
import { proposeTransaction } from "./withdraw/safe";
import { submitSettlement } from "./withdraw/settle";
import { getSignerOrAddress, SignerOrAddress } from "./withdraw/signer";
import {
getSignerOrAddress,
isSigner,
SignerOrAddress,
} from "./withdraw/signer";
import { getTokensWithBalanceAbove } from "./withdraw/token_balances";
import { getAllTradedTokens } from "./withdraw/traded_tokens";

Expand Down Expand Up @@ -787,11 +792,30 @@ export async function selfSell(input: SelfSellInput): Promise<string[] | null> {
dryRun: input.dryRun,
doNotPrompt: input.doNotPrompt,
});
await submitSettlement({
...input,
settlementContract: input.settlement,
encodedSettlement: finalSettlement,
});

if (!isSigner(input.solver)) {
const settlementData = input.settlement.interface.encodeFunctionData(
"settle",
finalSettlement,
);
const safeTxUrl = await proposeTransaction(
input.hre,
input.hre.network.name,
{
to: input.settlement.address,
data: settlementData,
authoringSafe: input.solver.address,
},
);
// TODO send slack message
console.log(`Sign settlement transaction in the Safe UI: ${safeTxUrl}`);
} else {
await submitSettlement({
...input,
settlementContract: input.settlement,
encodedSettlement: finalSettlement,
});
}

return orders.map((o) => o.sellToken.address);
}
Expand Down
59 changes: 59 additions & 0 deletions src/tasks/withdraw/safe.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import SafeApiKit from "@safe-global/api-kit";
import Safe, { EthersAdapter } from "@safe-global/protocol-kit";
import { SafeTransactionDataPartial } from "@safe-global/safe-core-sdk-types";
import { HardhatRuntimeEnvironment } from "hardhat/types";

interface Transaction {
authoringSafe: string;
to: string;
data: string;
}

function serviceUrlForNetwork(network: string): string {
if (["goerli", "mainnet", "gnosis-chain"].includes(network)) {
return `https://safe-transaction-${network}.safe.global`;
} else if (network === "xdai") {
return "https://safe-transaction-gnosis-chain.safe.global/";
} else {
throw new Error(`Unsupported network ${network}`);
}
}

// Creates and proposes a transaction to the Safe Multisig, which can then be confirmed by other signers in the Web UI. Returns the link to the transaction in the Web UI.
export async function proposeTransaction(
{ ethers }: HardhatRuntimeEnvironment,
network: string,
{ authoringSafe, to, data }: Transaction,
): Promise<string> {
const proposer = (await ethers.getSigners())[0];
const ethAdapter = new EthersAdapter({
ethers,
signerOrProvider: proposer,
});

const safeTransactionData: SafeTransactionDataPartial = {
to,
data,
value: "0",
};

const safeSdk = await Safe.create({ ethAdapter, safeAddress: authoringSafe });
const safeTransaction = await safeSdk.createTransaction({
safeTransactionData,
});
const safeTxHash = await safeSdk.getTransactionHash(safeTransaction);
const senderSignature = await safeSdk.signTransactionHash(safeTxHash);

const safeService = new SafeApiKit({
txServiceUrl: serviceUrlForNetwork(network),
ethAdapter,
});
await safeService.proposeTransaction({
safeAddress: authoringSafe,
safeTransactionData: safeTransaction.data,
safeTxHash,
senderAddress: await proposer.getAddress(),
senderSignature: senderSignature.data,
});
return `https://app.safe.global/transactions/tx?id=multisig_${authoringSafe}_${safeTxHash}&safe=${authoringSafe}`;
}
11 changes: 2 additions & 9 deletions src/tasks/withdraw/settle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,8 @@ export async function submitSettlement({
gasEstimator,
encodedSettlement,
}: SubmitSettlementInput) {
if (!isSigner(solver)) {
const settlementData = settlementContract.interface.encodeFunctionData(
"settle",
encodedSettlement,
);
console.log("Settlement transaction:");
console.log(`to: ${settlementContract.address}`);
console.log(`data: ${settlementData}`);
} else if (
if (
isSigner(solver) &&
!dryRun &&
(doNotPrompt || (await prompt(hre, "Submit settlement?")))
) {
Expand Down
Loading

0 comments on commit ae62a63

Please sign in to comment.