---
# System prepended metadata

title: 资产映射

---

# 资产映射

映射是资产跨链转移的重要步骤。所谓映射，就是利用两个网络（比如 TRON 和BTTC）上的智能合约进行资产的一一对应，便于诸如锁定、销毁以及转移等操作。

## 介绍

资产可以使用 BTTC 跨链桥在 BTTC 与 TRON/ Ethereum/ BSC 等公链之间来回转移。这些资产包括 ERC20、ERC721 等标准代币和其他自定义代币。

资产映射一般会有两种情况，第一种是资产已经预先存在其他公链上，需要将资产映射到 BTTC 上，请参考 [资产合约从其他公链映射到 BTTC](#资产合约从其他公链映射到-BTTC)。

另一种情况是在 BTTC 上直接创建代币，并需要将其转移到其他公链上，请参考[在 BTTC 铸造资产映射到其他公链](#在-BTTC-铸造资产映射到其他公链)。


## 资产合约从其他公链映射到 BTTC

适用于您已经在其他公链 TRON/ Ethereum/ BSC 上部署了资产合约，希望将其转移到 BTTC 的情况。

当其他公链的资产转移到 BTTC 时，每当从其他公链发起存款时，`ChildChainManagerProxy` 合约将调用 `deposit` 在内部铸造子链上的代币。在 BTTC 取款时， `withdraw` 将被调用在内部燃烧子链上的代币。这些方法保证资产在两条链的平衡。

### 需要满足的要求

在其他公链部署的资产合约，向 BTTC 转移资产时，需要满足特定的要求。

#### 确保在其他公链部署根代币

在 Tronscan/ Ethscan/ Bscscan 区块链浏览器验证根代币合约地址。

#### 在 BTTC 上部署子代币合约

在 BTTC 上部署子代币合约的示例，请参考 [`ChildERC20`](https://github.com/bttcprotocol/pos-portal/blob/master/contracts/child/ChildToken/ChildERC20.sol)。子代币合约可以自定义更改，但需要确保有 `deposit` 以及 `withdraw` 方法，且其中 `deposit` 只能被 `ChildChainManagerProxy` 合约调用，查看该合约的[主网地址](https://bttcscan.com/address/0x9a15f3a682d086c515be4037bda3b0676203a8ef#code)和[测试网地址](https://testnet.bttcscan.com/address/0xfe22c61f33e6d39c04de80b7de4b1d83f75210c4#code)。

注：

1. 子代币合约的构造函数中没有代币铸造。多数情况下，代币无需在BTTC上增发，仅 `ChildChainManager` 合约拥有该代币在BTTC上的铸币权（即 `_setupRole(DEPOSITOR_ROLE, childChainManager)` ）。

2. 对于无需在 BTTC 上增发的代币，若已经部署且授权其他合约铸币权，可以通过调用 `revoke` 或 `renounce` 方法放弃权限，如果无法放弃权限，请重新部署合约。社区团队将会审核子代币合约是否有多余的铸币权，任何多余的铸币权都会导致审核失败，因为多余的授权会带来增发的风险。

#### 提交映射请求

最后，请在 Bttcscan 验证子代币合约地址，在[这里](https://docs.google.com/forms/d/e/1FAIpQLScsdmIx3Ux_5P8T1ffmoPWipn7XD46GZEz-xbjwGdBrCGoCZg/viewform)提交映射请求。

## 在 BTTC 铸造资产映射到其他公链
### 什么是 BTTC 可铸造资产

在 BTTC 上直接创建代币，并在需要时将其转移到其他公链上，这种代币被称为 BTTC 可铸造资产。与其他公链相比，在 BTTC 上发行代币手续费较低，且速度更快,是一种更值得推荐的方法。

当 BTTC 的可铸造资产转移到其他公链时，必须先在 BTTC 上销毁该代币，并在其他公链上提交此次的销毁证明。`RootChainManager` 合约在内部调用一个特殊的合约，它能直接在其他公链上调用代币的铸造方法，并将代币铸造到用户地址。这个特殊的合约是 `MintableAssetPredicate`。

### 需要满足的要求

在 BTTC 上铸造可向其他公链转移的资产，需要满足特定的要求。

#### 在 BTTC 上部署合约

首先需要在 BTTC 上部署可铸造资产合约，子合约示例请参考 [`ChildMintableERC20`](https://github.com/bttcprotocol/pos-portal/blob/master/contracts/child/ChildToken/ChildMintableERC20.sol) 和 [`ChildMintableERC721`](https://github.com/bttcprotocol/pos-portal/blob/master/contracts/child/ChildToken/ChildMintableERC721.sol)，您可以进行自定义更改，但请确保存在 `deposit` , `withdraw` 和 `mint` 函数。

最重要的是，在 BTTC 上部署的可铸造资产合约中，应该给 BTTC 上的 `ChildChainManagerProxy` 合约赋予 `DEPOSITOR_ROLE` 角色。只有这个合约拥有 BTTC 上的铸币权，查看该合约的[主网地址](https://bttcscan.com/address/0x9a15f3a682d086c515be4037bda3b0676203a8ef#code)和[测试网地址](https://testnet.bttcscan.com/address/0xfe22c61f33e6d39c04de80b7de4b1d83f75210c4#code)。

#### 在 TRON/ Ethereum/ BSC 上部署合约

接下来，需要在提取资产的 TRON/ Ethereum/ BSC 上部署合约，以实现能够将 BTTC 铸造的资产提取到 TRON/ Ethereum/ BSC ，合约示例请参考 [`MintableERC20`](https://github.com/bttcprotocol/pos-portal/blob/master/contracts/root/RootToken/DummyMintableERC20.sol) and [`MintableERC721`](https://github.com/bttcprotocol/pos-portal/blob/master/contracts/root/RootToken/DummyMintableERC721.sol)。

最重要的是，在 TRON/ Ethereum/ BSC 上部署的资产合约需要指定对应的 `MintableAssetPredicateProxy` (例如： `MintableERC20PredicateProxy` 。Asset表示资产类型，下同) 合约被赋予铸币者角色。只有该合约有权在 TRON/ Ethereum/ BSC 链上铸币。

这个角色可以通过调用其他公链上代币合约的 `grantRole` 方法来赋予。第一个参数是 `PREDICATE_ROLE` 常量值，即 `0x12ff340d0cd9c652c747ca35727e68c547d0f0bfa7758d2e77f75acef481b4f2` ，第二个参数是相应的 `MintableERC20PredicateProxy`  或 `MintableERC721PredicateProxy` 地址如下所示。


<table>
   <tr>
      <td>公链网络</td>
      <td>合约名称</td>
      <td>合约地址</td>
   </tr>
   <tr>
      <td rowspan="2">TRON 主网</td>
      <td>MintableERC20PredicateProxy</td>
      <td>TH6JAd7DNka8Q6oKqkQMWJ6TYdLG6fQ6Kv</td>
   </tr>
   <tr>
      <td>MintableERC721PredicateProxy</td>
      <td>TEHTjbuQfiJsTb2UdKHjMgmFGwLDqVDNh5</td>
   </tr>
   <tr>
      <td rowspan="2">NILE 测试网</td>
      <td>MintableERC20PredicateProxy</td>
      <td>TUFWVA7fDHhvURrdNm9PS9mCPqx6T7mEPm</td>
   </tr>
   <tr>
      <td>MintableERC721PredicateProxy</td>
      <td>TNvb1f4dCTsM6WwYQAPfmkqeLg8XcDCBzG</td>
   </tr>
   <tr>
      <td rowspan="2">Ethereum 主网</td>
      <td>MintableERC20PredicateProxy</td>
      <td>0x9277a463a508f45115fdeaf22ffeda1b16352433</td>
   </tr>
   <tr>
      <td>MintableERC721PredicateProxy</td>
      <td>0xb932da3a1b3cba3f744edbc55cc1107575c37b6c</td>
   </tr>
   <tr>
      <td rowspan="2">Goerli 测试网</td>
      <td>MintableERC20PredicateProxy</td>
      <td>0x5af2bca15245d534ede87a03c007852e055d4b87</td>
   </tr>
   <tr>
      <td>MintableERC721PredicateProxy</td>
      <td>0xd769079211b69d6cf2e972d480a3809cd0103403</td>
   </tr>
   <tr>
      <td rowspan="2">BSC 主网</td>
      <td>MintableERC20PredicateProxy</td>
      <td>0xca266910d92a313e5f9eb1affc462bcbb7d9c4a9</td>
   </tr>
   <tr>
      <td>MintableERC721PredicateProxy</td>
      <td>0x5b0effa5ba0286cfc099724f8df6261215c596f5</td>
   </tr>
   <tr>
      <td rowspan="2">BSC 测试网</td>
      <td>MintableERC20PredicateProxy</td>
      <td>0x5f32098ca8b566f86b09a33e3b13e0da4a58c6c8</td>
   </tr>
   <tr>
      <td>MintableERC721PredicateProxy</td>
      <td>0x9f5684dc39496a9e56114ebf63b7b108df4567b0</td>
   </tr>
</table>

#### 提交映射请求

最后，请相应地在 Bttcscan 和 Tronscan/ Ethscan/ Bscscan 区块链浏览器验证两个合约地址，在[这里](https://docs.google.com/forms/d/e/1FAIpQLScsdmIx3Ux_5P8T1ffmoPWipn7XD46GZEz-xbjwGdBrCGoCZg/viewform)提交映射请求。