Transact with NFTs

Overview

You can use Ethereum and Polygon wallets to store and transfer non-fungible tokens (NFTs). BitGo wallets support the following NFT types:

  • Unwrapped CryptoPunks
  • ERC-721
  • ERC-1155

NFT-transaction flows differ from normal send transactions, because NFTs require smart contracts to transfer ownership. When transferring an NFT, you build and sign the transaction at the same time. Like other transactions, NFT transactions must still abide by your enterprise and wallet policies and receive any required approvals before BitGo signs and broadcasts the transaction.

Note: Don't send CryptoPunks to forwarder addresses. CryptoPunks are nonstandard NFTs that must be sent to base addresses. In addition, CryptoPunks aren't compatible with TSS wallets.

Don't send ERC NFTs to V1 forwarder wallets. Only V2 forwarder wallets can make outgoing NFT transactions. V1 forwarder wallets can receive NFTs, but they can't send NFTs to other wallets. If a V1 forwarder wallet receives an NFT, the NFT is permanently locked to that wallet.

Prerequisites

  • Get Started
  • Create Wallets
  • Have an NFT in your wallet
  • For CryptoPunks, use a block explorer, such as Etherscan, to create a transferPunk write contract, and save the transaction data.

Steps

When transacting with NFTs, always set the amount to 0.

  • Multisig
  • TSS
  • SDK (CryptoPunks)
  • SDK (ERC)
  • Express (CryptoPunks)
  • Express (ERC)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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', }); }

Step Result

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 { // This pending approval triggers because of the arbitrary data field in the transfer request. Passing arbitrary calldata can be a security vulnerability, so BitGo requires approval for the transaction. "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": "Custodial Enterprise Transaction ID Verification", "triggered": false } ], "resolvers": [] }, "triggeredPolicy": "63726fe10a3c94000758f362a24fc3ba" }

Next

Approve the transaction.

See Also