The L1AbstractionBridge is a smart contract designed to work in tandem with the L2 asset bridge, enabling the seamless transfer of various types of assets between ParaTon and Ton. Initially developed for Ton and Jettons, this contract has been enhanced to support a broader range of assets, facilitating more versatile cross-chain transactions.
This enhancement aims to foster a more connected ecosystem where a wide variety of assets can move securely and efficiently across different networks, promoting greater fluidity and interaction within the blockchain space.
The contract functions as an escrow, securely holding assets during the transfer process and ensuring their safe and accurate finalization on the target chain. This ensures that users can confidently utilize the bridge for diverse assets, knowing that their transfers will be handled with the utmost security and reliability.
import "@stdlib/deploy";
import "@stdlib/ownable";
contract L1AbstractionBridge with Deployable, Ownable {
// Contracts and configuration
superchainConfig: Address;
messenger: Address;
otherBridge: Address;
owner: Address;
version: String;
// Deposits mapping structure
deposits: map<Int, Bool>;
// Initial setup
init(superchainConfig: Address, messenger: Address, otherBridge: Address) {
self.superchainConfig = superchainConfig;
self.messenger = messenger;
self.otherBridge = otherBridge;
self.owner = sender(); // Using sender() as a placeholder
self.deposits = emptyMap();
self.version = "1.0.0";
}
// Check if the contract is paused
get fun paused(): Bool {
return false; // Temporarily returning false, replace with actual logic
}
// Placeholder function
fun send_raw_message(_to: Address, _message: Cell, _flags: Int) {
// This is a placeholder function, does nothing
}
// Finalize Abstraction Bridge
receive("finalizeBridgeAbstraction") {
// Simplified logic to avoid syntax errors
let _localToken: Address = sender(); // Using sender() as a placeholder
let _remoteToken: Address = sender(); // Using sender() as a placeholder
let _from: Address = sender(); // Using sender() as a placeholder
let _to: Address = sender(); // Using sender() as a placeholder
let _tokenId: Int = 0;
let _extraData: Slice = beginCell().endCell().beginParse();
// Using a simple hash as the depositKey
let depositKey: Int = _tokenId;
// Mark the token ID as no longer held in the L1 bridge
self.deposits.set(depositKey, false);
// Output simplified information to replace actual logic
self.send_raw_message(_to, beginCell().storeUint(0, 64).storeAddress(myAddress()).storeUint(_tokenId, 256).endCell(), 0);
// Trigger event
let event_data: Cell = beginCell()
.storeAddress(_localToken)
.storeAddress(_remoteToken)
.storeAddress(_from)
.storeAddress(_to)
.storeUint(_tokenId, 256)
.storeSlice(_extraData)
.endCell();
emit(event_data);
}
// Initiate Abstraction Bridge
receive("initiateBridgeAbstraction") {
// Simplified logic to avoid syntax errors
let _localToken: Address = sender(); // Using sender() as a placeholder
let _remoteToken: Address = sender(); // Using sender() as a placeholder
let _from: Address = sender(); // Using sender() as a placeholder
let _to: Address = sender(); // Using sender() as a placeholder
let _tokenId: Int = 0;
let _minGasLimit: Int = 0;
let _extraData: Slice = beginCell().endCell().beginParse();
// Using a simple hash as the depositKey
let depositKey: Int = _tokenId;
// Construct calldata for _l2Token.finalizeBridgeAbstraction(_to, _tokenId)
let message: Cell = beginCell()
.storeUint(0, 32)
.storeAddress(_remoteToken)
.storeAddress(_localToken)
.storeAddress(_from)
.storeAddress(_to)
.storeUint(_tokenId, 256)
.storeSlice(_extraData)
.endCell();
// Lock the token in the bridge
self.deposits.set(depositKey, true);
// Output simplified information to replace actual logic
self.send_raw_message(self.otherBridge, message, 0);
// Trigger event
let event_data: Cell = beginCell()
.storeAddress(_localToken)
.storeAddress(_remoteToken)
.storeAddress(_from)
.storeAddress(_to)
.storeUint(_tokenId, 256)
.storeSlice(_extraData)
.endCell();
emit(event_data);
}
}