Library for crafting batch transactions to purchase multiple OpenSea assets from a single Gnosis Safe Transaction
npm install @standard-crypto/opensea-batch-purchaser
An invocation of OpenSea's public function for fulfilling an order is difficult to understand at a glance. This tool allows for simulating a transaction to confirm both that it can be executed without failure, and that it correctly purchases the intended assets.
To verify that a batch transaction will succeed when executed, use the following:
-
Fetch the SafeTransactionHash from the Gnosis UI. (Note this is separate from an Ethereum transaction hash)
-
Fetch the contract address and token IDs of the tokens you expect to be purchased in this transaction
-
Find or create an Alchemy app for Ethereum mainnet and grab its API key
-
Run
# hardhat peer dependencies required for simulating transactions locally npm install \ hardhat \ @nomiclabs/hardhat-ethers \ @standard-crypto/opensea-batch-purchaser # Replace with your Alchemy app URL export ALCHEMY_MAINNET_URL=https://eth-mainnet.alchemyapi.io/v2/XXXXXXX export SAFE_TX_HASH=... export TOKEN_CONTRACT_ADDRESS=... npx simulate-erc721-purchase \ --gnosis-safe-tx-hash $SAFE_TX_HASH \ --token-contract-address $TOKEN_CONTRACT_ADDRESS \ --token-ids "[123, 6197]"
Note that the script simulates mainnet purchases only, where the asset being purchased is registered as part of an ERC721 token contract.
Example usage:
import OpenseaBulkPurchaser, { SinglePurchaseTx } from '@standard-crypto/opensea-batch-purchaser'
import { InfuraProvider } from '@ethersproject/providers'
const openseaBulkPurchaser = new OpenseaBulkPurchaser(new InfuraProvider(), { openseaApiKey, 'homestead', alchemyApiKey })
const purchaseTxs: SinglePurchaseTx[] = []
for (const token of tokens) {
const purchaseTx = await openseaBulkPurchaser.createSingleTokenPurchase(
token.id,
token.contractAddress,
tokenRecipientAddr,
)
purchaseTxs.push(purchaseTx)
}
const metaTx = await openseaBulkPurchaser.createBatchTxFromPurchases(purchaseTxs)
const safeTransaction = await openseaBulkPurchaser.safeTransactionFromMetaTransaction(metaTx, safeAddress)
There are several ways you can use the resultant Safe Transaction. See https://github.com/gnosis/ethers-multisend#what-to-do-with-the-encoded-transaction-objects for details.