🌉GOA Bridge

GOA can be bridged between Ethereum Mainnet and Arbitrum via the GOA Bridge.

In order to not depend on a single bridge, the GOAT Protocol uses the XERC-20 standard. This standard enables the DAO to add or remove any bridge as bridge provider. It also lets the DAO set mint and burn limits for any bridge depending on trust.

On Arbitrum, although the token is an XERC-20, the token symbol is GOA instead of xGOA since it is not necessary to differentiate it with the native token, as it happens on Ethereum Mainnet.

How can I bridge GOA?

The GOAT Protocol has its own bridge. Head over the Bridge tab in order to bridge GOA.

Bridging GOA is simple, select the origin chian, the destination chain, and the amount to bridge. All the available providers will appear below. Select the desired provider and click Review. It will display the bridging information.

How does the GOA Bridge work?

The GOA Bridge UI aggregates all bridge adapters available to bridge GOA to another chian. Each bridge adapter is an independent contract that manages the messaging logic of the underlying bridge used.

The messaging logic is used to communicate the underlying bridge (i.e. Layer Zero) how many GOA have to be minted on the destination chain, and who is the receiver.

function _bridge(address _user, uint256 _dstChainId, uint256 _amount, address _to) internal override {
        
        _bridgeOut(_user, _amount);

        //BRIDGE MESSAGING LOGIC HERE

        emit BridgedOut(_dstChainId, _user, _to, _amount);
    }

As GOA can't be minted or burned, the GOA Bridge uses a Lockbox (also known as Wrapper) to create xGOA, that can be minted and burned. When a user bridges GOA from Ethereum Mainnet to any L2, GOA is deposited in the Lockbox and xGOA is minted, just to be instantly burned, as it will be minted on the destination chain.

The Lockbox contract only exists on Ethereum Mainnet, since it is GOA's native chian. On all other chains the deposit logic is skipped as the Lockbox address is 0 and it just burns xGOA.

function _bridgeOut(address _user, uint256 _amount) internal virtual {
        if (address(lockbox) != address(0)) {
            GOA.safeTransferFrom(_user, address(this), _amount);
            lockbox.deposit(_amount);
            xGOA.burn(address(this), _amount);
        } else xGOA.burn(_user, _amount);
    }

The sum of all GOA on L2s is exactly the same as the amount of GOA locked in the Lockbox.

Governance on Layer 2s

Token holders of GOA on non-mainnet chains still keep their voting rights.

Last updated