BitcoinPod Overview
aka BOD
The remap is enabled by BitcoinPod.sol
, a smart contract managed by the user along with the Operator of Eigenlayer/BitDSM. It is a direct mapping of a Bitcoin Address on Ethereum, representated as a smart contract. This does not mint an ERC-20 but instead stores the value as bitcoinBalance
inside the contract.
contract BitcoinPod is IBitcoinPod, OwnableUpgradeable {
address public operator;
bytes public operatorBtcPubKey;
bytes public bitcoinAddress;
uint256 public bitcoinBalance;
bool public locked;
address public immutable manager;
bytes public signedBitcoinWithdrawTransaction;
A BitcoinPod contract is:
Non-transferable: Change of ownership of the BOD is not permitted.
Non-fungible: Only full value delegation is permissible.
Unique: A dedicated bitcoinpod contract deployed for each bitcoin address. Multiple bitcoin addresses cannot be mapped to a single bitcoinpod contract.
Stateful or stateless: Bitcoin address mapped to a bitcoinpod contract can either hold the funds or act as a pass through address.
As a client, you need to choose an operator to create a bitcoin address before you can deploy the BOD. The bitcoin address is created off-chain and later verified on chain to ensure the operator is part of the signing script.
The address verification happens before BitcoinPod contract is deployed to ensure only eligible bitcoin addresses are mapped.
function createPod(address operator, string memory btcAddress, bytes calldata scipt)
external
whenNotPaused
nonReentrant
returns (address)
{
require(_userToPod[msg.sender] == address(0), "User already has a pod");
require(IBitDSMRegistry(_bitDSMRegistry).isOperatorBtcKeyRegistered(operator), "Invalid operator");
bytes memory operatorBtcPubKey = IBitDSMRegistry(_bitDSMRegistry).getOperatorBtcPublicKey(operator);
// console.logBytes(operatorBtcPubKey);
// verify the btc address
// try catch block to handle the error
try IBitDSMServiceManager(_bitDSMServiceManager).verifyBTCAddress(btcAddress, scipt, operatorBtcPubKey) returns (bool isBtcAddress) {
console.log("isBtcAddress", isBtcAddress);
} catch (bytes memory reason) {
console.log("Error verifying BTC address");
console.logBytes(reason);
}
// console.log("isBtcAddress", isBtcAddress);
// emit BTCAddressVerified(operator, btcAddress);
// create the pod
BitcoinPod newPod = new BitcoinPod(address(this));
newPod.initialize(msg.sender, operator, operatorBtcPubKey, btcAddress);
// increment the total pods
_totalPods++;
// set the user to pod mapping
_setUserPod(msg.sender, address(newPod));
emit PodCreated(msg.sender, address(newPod), operator);
// return the pod address
return address(newPod);
Was this helpful?