Transact with NFTs - Multisig
Transfer NFTs (CryptoPunks, ERC-721, ERC-1155) from multisig Ethereum and Polygon wallets. See the Guide.
-
Transfer a CryptoPunk NFT from a multisig wallet. You must set the
amountto0for all NFT transactions. For CryptoPunks, use a block explorer such as Etherscan to create atransferPunkwrite contract and pass the resulting transaction data in thedatafield. The contract address should be the CryptoPunks contract address visible on the block explorer.Prerequisites: Have a CryptoPunk in your wallet. Do not send CryptoPunks to forwarder addresses -- they are nonstandard NFTs that must be sent to base addresses. CryptoPunks are not compatible with MPC wallets.
-
Transfer an ERC-721 or ERC-1155 NFT from a multisig wallet. Use the
tokenDataobject to specify the token contract address, token type (ERC721orERC1155), token ID, and token quantity. Set theamountto0. Only V2 forwarder wallets can make outgoing NFT transactions -- do not send ERC NFTs to V1 forwarder wallets.
// 1. Send NFT Transaction (CryptoPunks)
export COIN="<ASSET_ID>"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
curl -X POST \
https://app.bitgo-test.com/api/v2/$COIN/wallet/$WALLET_ID/sendcoins \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d '{
"address": "0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB",
"amount": "0",
"data": "0x8b72a2ec000000000000000000000000e514ee5028934565c3f839429ea3c091efe4c7010000000000000000000000000000000000000000000000000000000000000017"
}'
// 2. Send NFT Transaction (ERC)
curl -X POST \
https://app.bitgo-test.com/api/v2/$COIN/wallet/$WALLET_ID/sendcoins \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d '{
"address": "0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB",
"amount": "0",
"data": "0x8b72a2ec000000000000000000000000e514ee5028934565c3f839429ea3c091efe4c7010000000000000000000000000000000000000000000000000000000000000017"
}'
// 1. Send NFT Transaction (CryptoPunks)
async function sendPunk() {
const walletInstance = await bitgo
.coin('hteth')
.wallets()
.get({ id: '585c51a5df8380e0e3082e46' });
return walletInstance.sendMany({
recipients: [
{
amount: '0',
// Contract (visible on block explorer)
address: '0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB',
// Transaction data (built by transferPunk write contract on block explorer)
data: '0x8b72a2ec000000000000000000000000e514ee5028934565c3f839429ea3c091efe4c7010000000000000000000000000000000000000000000000000000000000000017',
},
],
walletPassphrase: 'VerySecurePassword1234',
});
}
// 2. Send NFT Transaction (ERC)
await walletInstance.sendMany({
recipients: [
{
amount: '0',
address: '0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB',
tokenData: {
tokenContractAddress: '0x252B4F5B517057dB563E14CF7274b4467289feA8',
tokenType: 'ERC721', // Can be ERC20, ERC721, or ERC1155
tokenId: '123',
tokenQuantity: '1',
},
},
],
walletPassphrase: 'VerySecurePassword1234',
});
// 1. Send NFT Transaction (CryptoPunks) Response
{
"error": "triggered all transactions policy",
"pendingApproval": {
"id": "63727a81cdbc820007b27caa7b76016d",
"coin": "hteth",
"wallet": "63726fde0a3c94000758f2790536041d",
"enterprise": "614a226f3da19200071b3d6a0180e87e",
"creator": "60f084f8cce2d40006c97181e6230f3b",
"createDate": "2022-11-14T17:27:29.128Z",
"info": {
"type": "transactionRequest",
"transactionRequest": {
"coinSpecific": {
"hteth": {
"eip1559": {
"_id": "63727a81cdbc820007b27cab",
"maxPriorityFeePerGas": 1500000000,
"maxFeePerGas": 133302263906
},
"recipients": [
{
"_id": "63727a81cdbc820007b27cac",
"amount": "0",
"address": "0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB",
"data": "0x8b72a2ec000000000000000000000000e514ee5028934565c3f839429ea3c091efe4c7010000000000000000000000000000000000000000000000000000000000000017"
}
],
"expireTime": 1669051648,
"contractSequenceId": 11,
"operationHash": "0x1018f971f00b0ae51f011ae9338214d6a59627e2d9915537974d2a325c12be49",
"signature": "0x8090aaf0fea7be5e723e68b531a4e60cd4d8e68ba2d12b3b622f9cc8173b6855241ecbb6aa9ddf8e1b6cef36eea698d463959330fff69b8c7068de5878381c4e1c"
}
},
"verificationItems": [],
"videoApprovers": [],
"requestedAmount": "0",
"fee": 0,
"sourceWallet": "63726fde0a3c94000758f2790536041d",
"recipients": [
{
"_id": "63727a81cdbc820007b27cad",
"address": "0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB",
"amount": "0",
"data": "0x8b72a2ec000000000000000000000000e514ee5028934565c3f839429ea3c091efe4c7010000000000000000000000000000000000000000000000000000000000000017"
}
],
"buildParams": {
"recipients": [
{
"amount": "0",
"address": "0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB",
"data": "0x8b72a2ec000000000000000000000000e514ee5028934565c3f839429ea3c091efe4c7010000000000000000000000000000000000000000000000000000000000000017"
}
]
},
"policyUniqueId": "63726fe10a3c94000758f362"
}
},
"state": "pendingFinalApproval",
"scope": "wallet",
"userIds": [
"60f084f8cce2d40006c97181e6230f3b",
"60f084f8cce2d40006c97181e6230f3b"
],
"approvalsRequired": 1,
"singleRunResults": [
{
"_id": "63727a81cdbc820007b27cae",
"ruleId": "Custody Enterprise Transaction ID Verification",
"triggered": false
}
],
"resolvers": []
},
"triggeredPolicy": "63726fe10a3c94000758f362a24fc3ba"
}