zcnbridge

package
v1.6.0-beta.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 16, 2022 License: MIT Imports: 47 Imported by: 1

README

Bridge SDK documentation

This bridge SDK comprises 3 types of client and following available methods

  1. Bridge deployer/owner for Authorizer Smart Contract
  2. Customer/client to execute Bridge Smart contract burn and mint transactions
  3. Token bridge authorizer for signing payload for 0Chain and Ethereum chain

Bridge owner SDK

Deployer or Owner SDK is required to Add or Remove Authorizers from Authorizers Smart Contract

Configuration file: ~/.zcn/owner.yaml to initialize owner

owner:
    # Address of Ethereum authorizers contract
    AuthorizersAddress: "0xFE20Ce9fBe514397427d20C91CB657a4478A0FFa"
    OwnerEthereumMnemonic: "add here the owner mnemonic that has deployed auth and bridge contracts"

Authorizes config: ~/.zcn/authorizers.yaml to add authorizers

Example:

transaction, err := owner.AddEthereumAuthorizer(context.TODO(), wallet.Address)
if err != nil {
    fmt.Println(err)
}

status, err := zcnbridge.ConfirmEthereumTransaction(transaction.Hash().String(), 5, time.Second*5)
if err != nil {
    fmt.Println(err)
}

Client SDK

This SDK is used to execute mint and burn transaction on both chains, Ethereum and 0Chain

Configuration file: ~/.zcn/bridge.yaml to initialize the client

Functionality:

  • Burn (0Chain and Ethereum)
  • Mint (0Chain and Ethereum)

For more detailed information please find documentation here

Token Bridge SDK

Functionality:

  1. Used by token bridge to sign payloads for 0Chain and Ethereum chains
  2. Checks transactions status and give the client payload to

Documentation

Index

Constants

View Source
const (
	BridgeClientConfigName         = "bridge.yaml"
	OwnerClientConfigName          = "owner.yaml"
	ZChainsClientConfigName        = "config.yaml"
	EthereumWalletClientConfigName = "wallet.json"
	EthereumWalletStorageDir       = "wallets"
	ClientConfigKeyName            = "bridge"
	OwnerConfigKeyName             = "owner"
)

Variables

View Source
var (
	DefaultClientIDEncoder = func(id string) []byte {
		return []byte(id)
	}
)

Functions

func AccountExists added in v1.3.5

func AccountExists(homedir, address string) bool

func ConfirmEthereumTransaction

func ConfirmEthereumTransaction(hash string, times int, duration time.Duration) (int, error)

func CreateHash added in v1.3.5

func CreateHash(message string) common.Hash

func CreateInitialClientConfig added in v1.3.6

func CreateInitialClientConfig(
	filename, homedir, ethereumAddress, bridgeAddress, wzcnAddress, ethereumNodeURL, password string,
	gas, value int64,
	consensus float64,
)

CreateInitialClientConfig create initial config for the bridge client using argument, filename - where file is saved (default: HOME/.zcn), ethereumAddress - client Ethereum address (should be also registered in the local key storage), bridgeAddress - bridge contract address, wzcnAddress - token contract address, ethereumNodeURL - Ethereum node url (usually, Infura/Alchemy), gas - default gas value for Ethereum transaction, value - is a default value for Ethereum transaction, default is 0, consensus - is a consensus to find for burn/mint tickets

func CreateInitialOwnerConfig added in v1.3.6

func CreateInitialOwnerConfig(
	filename, homedir, ethereumAddress, bridgeAddress, wzcnAddress, authorizersAddress, ethereumNodeURL, password string,
	gas, value int64,
)

CreateInitialOwnerConfig create initial config for the bridge owner using argument, filename - where file is saved (default: HOME/.zcn), ethereumAddress - client Ethereum address (should be also registered in the local key storage), bridgeAddress - bridge contract address, wzcnAddress - token contract address, authorizersAddress - authorizersAddress contract address, ethereumNodeURL - Ethereum node url (usually, Infura/Alchemy), gas - default gas value for Ethereum transaction, value - is a default value for Ethereum transaction, default is 0,

func CreateKeyStorage added in v1.3.5

func CreateKeyStorage(homedir, password string) error

CreateKeyStorage create, restore or unlock key storage

func CreateSignedTransaction added in v1.3.5

func CreateSignedTransaction(
	chainID *big.Int,
	client *ethclient.Client,
	fromAddress common.Address,
	privateKey *ecdsa.PrivateKey,
	gasLimitUnits uint64,
) *bind.TransactOpts

func DeleteAccount added in v1.4.7

func DeleteAccount(homedir, address string) bool

func ExitWithError added in v1.3.2

func ExitWithError(v ...interface{})

func GetConfigDir added in v1.3.5

func GetConfigDir() string

func GetTransactionStatus

func GetTransactionStatus(hash string) (int, error)

func ImportAccount added in v1.3.5

func ImportAccount(homedir, mnemonic, password string) (string, error)

func ListStorageAccounts added in v1.3.5

func ListStorageAccounts(homedir string) []common.Address

ListStorageAccounts List available accounts

func UpdateClientEthereumAddress added in v1.4.2

func UpdateClientEthereumAddress(homedir, address string) (err error)

Types

type AuthorizerNodeResponse added in v1.4.1

type AuthorizerNodeResponse struct {
	ID  string `json:"id"`
	URL string `json:"url"`
}

func GetAuthorizers

func GetAuthorizers() ([]*AuthorizerNodeResponse, error)

GetAuthorizers Returns authorizers

type Bridge

type Bridge struct {
	Owner *BridgeOwnerYaml `yaml:"owner"`
}

type BridgeClient added in v1.3.5

type BridgeClient struct {
	*BridgeConfig
	*BridgeClientConfig
	*Instance
}

func CreateBridgeClient added in v1.3.5

func CreateBridgeClient(cfg *viper.Viper) *BridgeClient

func SetupBridgeClientSDK added in v1.3.5

func SetupBridgeClientSDK(cfg *BridgeSDKConfig) *BridgeClient

SetupBridgeClientSDK Use this from standalone application 0Chain SDK initialization is required

func (*BridgeClient) BurnWZCN added in v1.3.5

func (b *BridgeClient) BurnWZCN(ctx context.Context, amountTokens int64) (*types.Transaction, error)

BurnWZCN Burns WZCN tokens on behalf of the 0ZCN client amountTokens - ZCN tokens clientID - 0ZCN client ERC20 signature: "burn(uint256,bytes)"

func (*BridgeClient) BurnZCN added in v1.3.5

func (b *BridgeClient) BurnZCN(ctx context.Context, amount int64) (*transaction.Transaction, error)

BurnZCN burns ZCN tokens before conversion from ZCN to WZCN as a first step

func (*BridgeClient) GetBalance added in v1.3.5

func (b *BridgeClient) GetBalance() (*big.Int, error)

GetBalance returns balance of the current client

func (*BridgeClient) ID added in v1.3.5

func (b *BridgeClient) ID() string

ID returns id of Node.

func (*BridgeClient) IncreaseBurnerAllowance added in v1.3.5

func (b *BridgeClient) IncreaseBurnerAllowance(ctx context.Context, amountWei Wei) (*types.Transaction, error)

IncreaseBurnerAllowance Increases allowance for bridge contract address to transfer WZCN tokens on behalf of the token owner to the Burn TokenPool During the burn the script transfers amount from token owner to the bridge burn token pool Example: owner wants to burn some amount. The contract will transfer some amount from owner address to the pool. So the owner must call IncreaseAllowance of the WZCN token with 2 parameters: spender address which is the bridge contract and amount to be burned (transferred) ERC20 signature: "increaseAllowance(address,uint256)"

func (*BridgeClient) IncrementNonce added in v1.3.5

func (b *BridgeClient) IncrementNonce() int64

func (*BridgeClient) MintWZCN added in v1.3.5

func (b *BridgeClient) MintWZCN(ctx context.Context, payload *ethereum.MintPayload) (*types.Transaction, error)

MintWZCN Mint ZCN tokens on behalf of the 0ZCN client payload: received from authorizers

func (*BridgeClient) MintZCN added in v1.3.5

func (b *BridgeClient) MintZCN(ctx context.Context, payload *zcnsc.MintPayload) (*transaction.Transaction, error)

MintZCN mints ZCN tokens after receiving proof-of-burn of WZCN tokens

func (*BridgeClient) QueryEthereumMintPayload added in v1.3.5

func (b *BridgeClient) QueryEthereumMintPayload(zchainBurnHash string) (*ethereum.MintPayload, error)

QueryEthereumMintPayload gets burn ticket and creates mint payload to be minted in the Ethereum chain zchainBurnHash - Ethereum burn transaction hash

func (*BridgeClient) QueryZChainMintPayload added in v1.3.5

func (b *BridgeClient) QueryZChainMintPayload(ethBurnHash string) (*zcnsc.MintPayload, error)

QueryZChainMintPayload gets burn ticket and creates mint payload to be minted in the ZChain ethBurnHash - Ethereum burn transaction hash

func (*BridgeClient) SignWithEthereumChain added in v1.3.5

func (b *BridgeClient) SignWithEthereumChain(message string) ([]byte, error)

SignWithEthereumChain signs the digest with Ethereum chain signer taking key from the current user key storage

func (*BridgeClient) VerifyZCNTransaction added in v1.3.5

func (b *BridgeClient) VerifyZCNTransaction(ctx context.Context, hash string) (*transaction.Transaction, error)

VerifyZCNTransaction verifies 0CHain transaction

type BridgeClientConfig added in v1.3.5

type BridgeClientConfig struct {
	ContractsRegistry
	EthereumConfig
	EthereumAddress string
	Password        string
	Homedir         string
}

func (*BridgeClientConfig) CreateSignedTransactionFromKeyStore added in v1.4.7

func (b *BridgeClientConfig) CreateSignedTransactionFromKeyStore(client *ethclient.Client, gasLimitUnits uint64) *bind.TransactOpts

type BridgeConfig

type BridgeConfig struct {
	ConsensusThreshold float64
}

type BridgeOwner added in v1.3.5

type BridgeOwner struct {
	*BridgeClientConfig
	*Instance
}

func CreateBridgeOwner added in v1.3.5

func CreateBridgeOwner(cfg *viper.Viper) *BridgeOwner

func SetupBridgeOwnerSDK added in v1.3.5

func SetupBridgeOwnerSDK(cfg *BridgeSDKConfig) *BridgeOwner

SetupBridgeOwnerSDK Use this from standalone application to initialize bridge owner. 0Chain SDK initialization is not required in this case

func (*BridgeOwner) AddEthereumAuthorizer added in v1.3.5

func (b *BridgeOwner) AddEthereumAuthorizer(ctx context.Context, address common.Address) (*types.Transaction, error)

AddEthereumAuthorizer Adds authorizer to Ethereum bridge. Only contract deployer can call this method

func (*BridgeOwner) AddEthereumAuthorizers added in v1.3.5

func (b *BridgeOwner) AddEthereumAuthorizers(configDir string)

func (*BridgeOwner) ID added in v1.3.5

func (b *BridgeOwner) ID() string

ID returns id of Node.

type BridgeOwnerYaml added in v1.3.6

type BridgeOwnerYaml struct {
	// KeyStorage unlock storage
	Password string `yaml:"Password"`
	// User's address
	EthereumAddress string `yaml:"EthereumAddress"`
	// Address of Ethereum bridge contract
	BridgeAddress string `yaml:"BridgeAddress"`
	// Address of WZCN token (Example: https://ropsten.etherscan.io/token/0x930E1BE76461587969Cb7eB9BFe61166b1E70244)
	WzcnAddress string `yaml:"WzcnAddress"`
	// Address of Authorizers smart contract
	AuthorizersAddress string `yaml:"AuthorizersAddress"`
	// URL of ethereum RPC node (infura or alchemy)
	EthereumNodeURL string `yaml:"EthereumNodeURL"`
	// Gas limit to execute ethereum transaction
	GasLimit int64 `yaml:"GasLimit"`
	// Value to execute ZCN smart contracts in wei
	Value int64 `yaml:"Value"`
}

type BridgeSDKConfig added in v1.3.5

type BridgeSDKConfig struct {
	LogLevel         *string
	LogPath          *string
	ConfigBridgeFile *string
	ConfigChainFile  *string
	ConfigDir        *string
	Development      *bool
}

func ReadClientConfigFromCmd

func ReadClientConfigFromCmd() *BridgeSDKConfig

ReadClientConfigFromCmd reads config from command line Bridge has several configs: Chain config at ~/.zcn/config.json User 0Chain wallet config at ~/.zcn/wallet.json User EthBridge config ~/.zcn/bridge.json Owner EthBridge config ~/.zcn/bridgeowner.json

type ContractsRegistry added in v1.3.5

type ContractsRegistry struct {
	// Address of Ethereum bridge contract
	BridgeAddress string
	// Address of WZCN Ethereum wrapped token
	WzcnAddress string
	// Address of Ethereum authorizers contract
	AuthorizersAddress string
}

type EthereumConfig added in v1.3.5

type EthereumConfig struct {
	// URL of ethereum RPC node (infura or alchemy)
	EthereumNodeURL string
	// Gas limit to execute ethereum transaction
	GasLimit uint64
	// Value to execute Ethereum smart contracts (default = 0)
	Value int64
}

func (*EthereumConfig) CreateEthClient added in v1.3.5

func (b *EthereumConfig) CreateEthClient() (*ethclient.Client, error)

type Instance

type Instance struct {
	// contains filtered or unexported fields
}

type JobError

type JobError struct {
	// contains filtered or unexported fields
}

JobError result of internal request wrapped in authorizer job

func (*JobError) MarshalJSON

func (e *JobError) MarshalJSON() ([]byte, error)

func (*JobError) UnmarshalJSON

func (e *JobError) UnmarshalJSON(buf []byte) error

type JobResult

type JobResult interface {
	// Error = Status of Authorizer job
	Error() error
	// Data returns the actual result
	Data() interface{}
	// SetAuthorizerID Assigns authorizer ID to the Job
	SetAuthorizerID(ID string)
	// GetAuthorizerID returns authorizer ID
	GetAuthorizerID() string
}

JobResult = Authorizer task result, it wraps actual result of the query inside authorizer

type JobStatus

type JobStatus uint

JobStatus = Ethereum transaction status

type ProofEthereumBurn

type ProofEthereumBurn struct {
	TxnID             string `json:"ethereum_txn_id"`
	Nonce             int64  `json:"nonce"`
	Amount            int64  `json:"amount"`
	ReceivingClientID string `json:"receiving_client_id"` // 0ZCN address
	Signature         string `json:"signature"`
}

ProofEthereumBurn Authorizer returns this type for Ethereum transaction

type ProofZCNBurn

type ProofZCNBurn struct {
	AuthorizerID    string `json:"authorizer_id,omitempty"`
	TxnID           string `json:"0chain_txn_id"`
	Nonce           int64  `json:"nonce"`
	Amount          int64  `json:"amount"`
	EthereumAddress string `json:"ethereum_address"`
	Signature       []byte `json:"signatures"`
}

ProofZCNBurn Authorizer returns this type for ZCN transaction

func (*ProofZCNBurn) Data

func (r *ProofZCNBurn) Data() interface{}

func (*ProofZCNBurn) Error

func (r *ProofZCNBurn) Error() error

func (*ProofZCNBurn) GetAuthorizerID

func (r *ProofZCNBurn) GetAuthorizerID() string

func (*ProofZCNBurn) SetAuthorizerID

func (r *ProofZCNBurn) SetAuthorizerID(id string)

type WZCNBurnEvent

type WZCNBurnEvent struct {
	// 	AuthorizerID Authorizer ID
	AuthorizerID string `json:"authorizer_id,omitempty"`
	// BurnTicket Returns burn ticket
	BurnTicket *ProofEthereumBurn `json:"ticket,omitempty"`
	// Err gives error of job on server side
	Err *JobError `json:"err,omitempty"`
	// Status gives job status on server side (authoriser)
	Status JobStatus `json:"status,omitempty"`
}

WZCNBurnEvent returned from burn ticket handler of: /v1/ether/burnticket/get

func (*WZCNBurnEvent) Data

func (r *WZCNBurnEvent) Data() interface{}

func (*WZCNBurnEvent) Error

func (r *WZCNBurnEvent) Error() error

func (*WZCNBurnEvent) GetAuthorizerID

func (r *WZCNBurnEvent) GetAuthorizerID() string

func (*WZCNBurnEvent) SetAuthorizerID

func (r *WZCNBurnEvent) SetAuthorizerID(id string)

type Wei added in v1.3.3

type Wei int64

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL