Skip to content

Commit

Permalink
remove unnecessary metadata from Signature721PayloadOutput (thirdweb-…
Browse files Browse the repository at this point in the history
…dev#126)

remove unnecessary metadata from Signature721PayloadOutput (thirdweb-dev#125)

which allow us to remove an unnecessary metadata fetch from GenerateBatchWithUris

Co-authored-by: ricebin <ricebin@users.noreply.github.com>
  • Loading branch information
adam-maj and ricebin authored Mar 29, 2023
1 parent c2e6bd7 commit c2c1dc0
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 79 deletions.
118 changes: 51 additions & 67 deletions thirdweb/erc721_signature_minting.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package thirdweb
import (
"context"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"math/big"
Expand All @@ -23,27 +22,27 @@ import (
// You can access this interface from the NFT Collection contract under the
// signature interface.
type ERC721SignatureMinting struct {
legacy *abi.TokenERC721
extension *abi.SignatureMintERC721
Helper *contractHelper
storage storage
legacy *abi.TokenERC721
extension *abi.SignatureMintERC721
Helper *contractHelper
storage storage
}

func newERC721SignatureMinting(provider *ethclient.Client, address common.Address, privateKey string, storage storage) (*ERC721SignatureMinting, error) {
legacy, err := abi.NewTokenERC721(address, provider)
if err != nil {
return nil, err
}
}

extension, err := abi.NewSignatureMintERC721(address, provider)
if err != nil {
return nil, err
}
}

helper, err := newContractHelper(address, provider, privateKey)
if err != nil {
return nil, err
}
}

return &ERC721SignatureMinting{
legacy,
Expand Down Expand Up @@ -86,12 +85,12 @@ func (signature *ERC721SignatureMinting) MintAndAwait(ctx context.Context, signe
}

func (signature *ERC721SignatureMinting) MintWithOpts(ctx context.Context, signedPayload *SignedPayload721, txOpts *bind.TransactOpts) (*types.Transaction, error) {
if (signature.isLegacyContract(ctx)) {
message, err := signature.mapLegacyPayloadToContractStruct(ctx, signedPayload.Payload)
if signature.isLegacyContract(ctx) {
message, err := mapLegacyPayloadToContractStruct(signedPayload.Payload)
if err != nil {
return nil, err
}

if err := setErc20Allowance(
ctx,
signature.Helper,
Expand All @@ -101,19 +100,19 @@ func (signature *ERC721SignatureMinting) MintWithOpts(ctx context.Context, signe
); err != nil {
return nil, err
}

signatureBytes, err := hex.DecodeString(signedPayload.Signature[2:])
if err != nil {
return nil, err
}

return signature.legacy.MintWithSignature(txOpts, *message, signatureBytes)
} else {
message, err := signature.mapPayloadToContractStruct(ctx, signedPayload.Payload)
message, err := mapPayloadToContractStruct(signedPayload.Payload)
if err != nil {
return nil, err
}

if err := setErc20Allowance(
ctx,
signature.Helper,
Expand All @@ -123,12 +122,12 @@ func (signature *ERC721SignatureMinting) MintWithOpts(ctx context.Context, signe
); err != nil {
return nil, err
}

signatureBytes, err := hex.DecodeString(signedPayload.Signature[2:])
if err != nil {
return nil, err
}

return signature.extension.MintWithSignature(txOpts, *message, signatureBytes)
}
}
Expand All @@ -145,46 +144,46 @@ func (signature *ERC721SignatureMinting) MintWithOpts(ctx context.Context, signe
// signedPayloads, err := contract.Signature.GenerateBatch(payloads)
// tx, err := contract.Signature.MintBatch(context.Background(), signedPayloads)
func (signature *ERC721SignatureMinting) MintBatch(ctx context.Context, signedPayloads []*SignedPayload721) (*types.Transaction, error) {
if (signature.isLegacyContract(ctx)) {
if signature.isLegacyContract(ctx) {
contractPayloads := []*abi.ITokenERC721MintRequest{}
for _, signedPayload := range signedPayloads {
price, ok := big.NewInt(0).SetString(signedPayload.Payload.Price, 10)
if !ok {
return nil, errors.New("Specified price was not a valid big.Int")
}

if price.Cmp(big.NewInt(0)) == 1 {
return nil, fmt.Errorf("Can only batch free mints. For mints with a price, use the Mint() function.")
}
payload, err := signature.mapLegacyPayloadToContractStruct(ctx, signedPayload.Payload)

payload, err := mapLegacyPayloadToContractStruct(signedPayload.Payload)
if err != nil {
return nil, err
}

contractPayloads = append(contractPayloads, payload)
}

encoded := [][]byte{}
for i, payload := range contractPayloads {
txOpts, err := signature.Helper.getEncodedTxOptions(ctx)
if err != nil {
return nil, err
}

signatureBytes, err := hex.DecodeString(signedPayloads[i].Signature[2:])
if err != nil {
return nil, err
}

tx, err := signature.legacy.MintWithSignature(txOpts, *payload, signatureBytes)
if err != nil {
return nil, err
}

encoded = append(encoded, tx.Data())
}

txOpts, err := signature.Helper.GetTxOptions(ctx)
if err != nil {
return nil, err
Expand All @@ -193,7 +192,7 @@ func (signature *ERC721SignatureMinting) MintBatch(ctx context.Context, signedPa
if err != nil {
return nil, err
}

return signature.Helper.AwaitTx(ctx, tx.Hash())
} else {
contractPayloads := []*abi.ISignatureMintERC721MintRequest{}
Expand All @@ -202,39 +201,39 @@ func (signature *ERC721SignatureMinting) MintBatch(ctx context.Context, signedPa
if !ok {
return nil, errors.New("Specified price was not a valid big.Int")
}

if price.Cmp(big.NewInt(0)) == 1 {
return nil, fmt.Errorf("Can only batch free mints. For mints with a price, use the Mint() function.")
}
payload, err := signature.mapPayloadToContractStruct(ctx, signedPayload.Payload)

payload, err := mapPayloadToContractStruct(signedPayload.Payload)
if err != nil {
return nil, err
}

contractPayloads = append(contractPayloads, payload)
}

encoded := [][]byte{}
for i, payload := range contractPayloads {
txOpts, err := signature.Helper.getEncodedTxOptions(ctx)
if err != nil {
return nil, err
}

signatureBytes, err := hex.DecodeString(signedPayloads[i].Signature[2:])
if err != nil {
return nil, err
}

tx, err := signature.extension.MintWithSignature(txOpts, *payload, signatureBytes)
if err != nil {
return nil, err
}

encoded = append(encoded, tx.Data())
}

txOpts, err := signature.Helper.GetTxOptions(ctx)
if err != nil {
return nil, err
Expand All @@ -245,7 +244,7 @@ func (signature *ERC721SignatureMinting) MintBatch(ctx context.Context, signedPa
if err != nil {
return nil, err
}

return signature.Helper.AwaitTx(ctx, tx.Hash())
}
}
Expand All @@ -268,22 +267,22 @@ func (signature *ERC721SignatureMinting) Verify(ctx context.Context, signedPaylo
return false, err
}

if (signature.isLegacyContract(ctx)) {
message, err := signature.mapLegacyPayloadToContractStruct(ctx, mintRequest)
if signature.isLegacyContract(ctx) {
message, err := mapLegacyPayloadToContractStruct(mintRequest)

if err != nil {
return false, err
}

verification, _, err := signature.legacy.Verify(&bind.CallOpts{Context: ctx}, *message, mintSignatureBytes)
return verification, err
} else {
message, err := signature.mapPayloadToContractStruct(ctx, mintRequest)
message, err := mapPayloadToContractStruct(mintRequest)

if err != nil {
return false, err
}

verification, err := signature.extension.Verify(&bind.CallOpts{Context: ctx}, *message, mintSignatureBytes)
return verification.Success, err
}
Expand Down Expand Up @@ -398,7 +397,6 @@ func (signature *ERC721SignatureMinting) GenerateBatch(ctx context.Context, payl
MintStartTime: p.MintStartTime,
MintEndTime: p.MintEndTime,
PrimarySaleRecipient: p.PrimarySaleRecipient,
Metadata: p.Metadata,
RoyaltyRecipient: p.RoyaltyRecipient,
RoyaltyBps: p.RoyaltyBps,
Uri: uri,
Expand Down Expand Up @@ -461,17 +459,6 @@ func (signature *ERC721SignatureMinting) GenerateBatchWithUris(ctx context.Conte
return nil, err
}

body, err := signature.storage.Get(ctx, p.MetadataUri)
if err != nil {
return nil, err
}

metadata := NFTMetadataInput{}
err = json.Unmarshal(body, &metadata)
if err != nil {
return nil, err
}

payload := &Signature721PayloadOutput{
To: p.To,
Price: price.String(),
Expand All @@ -481,7 +468,6 @@ func (signature *ERC721SignatureMinting) GenerateBatchWithUris(ctx context.Conte
PrimarySaleRecipient: p.PrimarySaleRecipient,
RoyaltyRecipient: p.RoyaltyRecipient,
RoyaltyBps: p.RoyaltyBps,
Metadata: &metadata,
Uri: p.MetadataUri,
Uid: id,
}
Expand All @@ -491,7 +477,6 @@ func (signature *ERC721SignatureMinting) GenerateBatchWithUris(ctx context.Conte
return nil, err
}


domainSeparator, err := typedData.HashStruct("EIP712Domain", typedData.Domain.Map())
if err != nil {
return nil, err
Expand Down Expand Up @@ -531,7 +516,7 @@ func (signature *ERC721SignatureMinting) generateMessage(ctx context.Context, mi
return nil, err
}

if (signature.isLegacyContract(ctx)) {
if signature.isLegacyContract(ctx) {
message := signerTypes.TypedDataMessage{
"to": mintRequest.To,
"royaltyRecipient": mintRequest.RoyaltyRecipient,
Expand All @@ -544,7 +529,7 @@ func (signature *ERC721SignatureMinting) generateMessage(ctx context.Context, mi
"validityEndTimestamp": fmt.Sprintf("%v", mintRequest.MintEndTime),
"uid": mintRequest.Uid[:],
}

typedData := signerTypes.TypedData{
Types: signerTypes.Types{
"MintRequest": []signerTypes.Type{
Expand Down Expand Up @@ -575,7 +560,7 @@ func (signature *ERC721SignatureMinting) generateMessage(ctx context.Context, mi
},
Message: message,
}

return &typedData, nil
} else {
message := signerTypes.TypedDataMessage{
Expand Down Expand Up @@ -631,7 +616,7 @@ func (signature *ERC721SignatureMinting) generateMessage(ctx context.Context, mi
func (signature *ERC721SignatureMinting) isLegacyContract(ctx context.Context) bool {
contractType, err := signature.legacy.ContractType(&bind.CallOpts{
Context: ctx,
});
})
if err != nil {
return false
}
Expand All @@ -640,7 +625,7 @@ func (signature *ERC721SignatureMinting) isLegacyContract(ctx context.Context) b
return hex.EncodeToString(contractType[:]) == "546f6b656e455243373231000000000000000000000000000000000000000000"
}

func (signature *ERC721SignatureMinting) mapLegacyPayloadToContractStruct(ctx context.Context, mintRequest *Signature721PayloadOutput) (*abi.ITokenERC721MintRequest, error) {
func mapLegacyPayloadToContractStruct(mintRequest *Signature721PayloadOutput) (*abi.ITokenERC721MintRequest, error) {
price, ok := big.NewInt(0).SetString(mintRequest.Price, 10)
if !ok {
return nil, errors.New("Specified price was not a valid big.Int")
Expand All @@ -660,7 +645,7 @@ func (signature *ERC721SignatureMinting) mapLegacyPayloadToContractStruct(ctx co
}, nil
}

func (signature *ERC721SignatureMinting) mapPayloadToContractStruct(ctx context.Context, mintRequest *Signature721PayloadOutput) (*abi.ISignatureMintERC721MintRequest, error) {
func mapPayloadToContractStruct(mintRequest *Signature721PayloadOutput) (*abi.ISignatureMintERC721MintRequest, error) {
price, ok := big.NewInt(0).SetString(mintRequest.Price, 10)
if !ok {
return nil, errors.New("Specified price was not a valid big.Int")
Expand All @@ -680,4 +665,3 @@ func (signature *ERC721SignatureMinting) mapPayloadToContractStruct(ctx context.
Uid: mintRequest.Uid,
}, nil
}

22 changes: 10 additions & 12 deletions thirdweb/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,19 +144,17 @@ type Signature721PayloadInputWithUri struct {
RoyaltyBps int
}


type Signature721PayloadOutput struct {
To string `json:"to"`
Price string `json:"price"`
CurrencyAddress string `json:"currencyAddress"`
MintStartTime int `json:"mintStartTime"`
MintEndTime int `json:"mintEndTime"`
PrimarySaleRecipient string `json:"primarySaleRecipient"`
Metadata *NFTMetadataInput `json:"metadata"`
RoyaltyRecipient string `json:"royaltyRecipient"`
RoyaltyBps int `json:"royaltyBps"`
Uri string `json:"uri"`
Uid [32]byte `json:"uid"`
To string `json:"to"`
Price string `json:"price"`
CurrencyAddress string `json:"currencyAddress"`
MintStartTime int `json:"mintStartTime"`
MintEndTime int `json:"mintEndTime"`
PrimarySaleRecipient string `json:"primarySaleRecipient"`
RoyaltyRecipient string `json:"royaltyRecipient"`
RoyaltyBps int `json:"royaltyBps"`
Uri string `json:"uri"`
Uid [32]byte `json:"uid"`
}

type SignedPayload721 struct {
Expand Down

0 comments on commit c2c1dc0

Please sign in to comment.