code: func NewInbox(prvKey *ecdsa.PrivateKey, contractAddr, beneficiary common.Address, signer *ecdsa.PublicKey, abigen bind.ContractBackend) (*Inbox, error) {
  	if signer == nil {
  		return nil, fmt.Errorf("signer is null")
  	}
  	chbook, err := contract.NewChequebook(contractAddr, abigen)
  	if err != nil {
  		return nil, err
  	}
  	transactOpts := bind.NewKeyedTransactor(prvKey)
  	transactOpts.GasLimit = gasToCash
  	session := &contract.ChequebookSession{
  		Contract:     chbook,
  		TransactOpts: *transactOpts,
  	}
  	sender := transactOpts.From
  
  	inbox := &Inbox{
  		contract:    contractAddr,
  		beneficiary: beneficiary,
  		sender:      sender,
  		signer:      signer,
  		session:     session,
  		cashed:      new(big.Int).Set(common.Big0),
  		log:         log.New("contract", contractAddr),
  	}
  	inbox.log.Trace("New chequebook inbox initialized", "beneficiary", inbox.beneficiary, "signer", hexutil.Bytes(crypto.FromECDSAPub(signer)))
  	return inbox, nil
  }
docs: // NewInbox creates an Inbox. An Inboxes is not persisted, the cumulative sum is updated
  // from blockchain when first cheque is received.