SafeCoin
Home
NetworkAccountsCheckpointsEpochsStakeTransactionsValidators
AssetsSAFETokensNFTs
EcosystemDeFiProjects
AnalyticsStatisticsEmissions
DevelopersAPI

Package

0xbf9e709da3d786480c22b9c56fb0ad746c4c8fb7b2c0cb5b91f0d5c485bd9bb2

version
1
digest
69Z4BKudCAkP5ek6YnmvpwoAQ6kMcJ2piECyVo8pPyWn
previous transaction
BU62oGEzCWAMELeJLQjEGG5hr9SgMPq9UogYgTpp9SbP

Modules (1)

pool
// Move bytecode v6
module bf9e709da3d786480c22b9c56fb0ad746c4c8fb7b2c0cb5b91f0d5c485bd9bb2.pool {
use 0000000000000000000000000000000000000000000000000000000000000002::balance;
use 0000000000000000000000000000000000000000000000000000000000000002::coin;
use 0000000000000000000000000000000000000000000000000000000000000002::event;
use 0000000000000000000000000000000000000000000000000000000000000002::object;
use 0000000000000000000000000000000000000000000000000000000000000002::table;
use 0000000000000000000000000000000000000000000000000000000000000002::transfer;
use 0000000000000000000000000000000000000000000000000000000000000002::tx_context;
use 0000000000000000000000000000000000000000000000000000000000000001::option;
use 0000000000000000000000000000000000000000000000000000000000000001::type_name;
use 0000000000000000000000000000000000000000000000000000000000000001::u128;

struct LP<phantom Ty0, phantom Ty1> has drop {
	dummy_field: bool
}

struct Pool<phantom Ty0, phantom Ty1> has key {
	id: UID,
	reserve_a: Balance<Ty0>,
	reserve_b: Balance<Ty1>,
	lp_supply: Supply<LP<Ty0, Ty1>>,
	locked_lp: Balance<LP<Ty0, Ty1>>,
	fee_bps: u64
}

struct PoolKey has copy, drop, store {
	a: TypeName,
	b: TypeName
}

struct Registry has key {
	id: UID,
	pools: Table<PoolKey, ID>
}

struct PoolCreated has copy, drop {
	pool_id: ID,
	coin_a: TypeName,
	coin_b: TypeName,
	fee_bps: u64
}

struct LiquidityAdded has copy, drop {
	pool_id: ID,
	provider: address,
	amount_a: u64,
	amount_b: u64,
	lp_minted: u64
}

struct LiquidityRemoved has copy, drop {
	pool_id: ID,
	provider: address,
	amount_a: u64,
	amount_b: u64,
	lp_burned: u64
}

struct Swapped has copy, drop {
	pool_id: ID,
	trader: address,
	a_to_b: bool,
	amount_in: u64,
	amount_out: u64
}

init(Arg0: &mut TxContext) {
B0:
	0: CopyLoc[0](Arg0: &mut TxContext)
	1: Call object::new(&mut TxContext): UID
	2: MoveLoc[0](Arg0: &mut TxContext)
	3: Call table::new<PoolKey, ID>(&mut TxContext): Table<PoolKey, ID>
	4: Pack[3](Registry)
	5: Call transfer::share_object<Registry>(Registry)
	6: Ret
}

public create_pool<Ty0, Ty1>(Arg0: &mut Registry, Arg1: u64, Arg2: &mut TxContext): ID {
L3:	loc0: bool
L4:	loc1: TypeName
L5:	loc2: TypeName
L6:	loc3: Pool<Ty0, Ty1>
L7:	loc4: ID
B0:
	0: CopyLoc[1](Arg1: u64)
	1: LdConst[7](u64: 10000)
	2: Lt
	3: BrFalse(5)
B1:
	4: Branch(11)
B2:
	5: MoveLoc[0](Arg0: &mut Registry)
	6: Pop
	7: MoveLoc[2](Arg2: &mut TxContext)
	8: Pop
	9: LdConst[5](u64: 5)
	10: Abort
B3:
	11: Call type_name::get<Ty0>(): TypeName
	12: StLoc[4](loc1: TypeName)
	13: Call type_name::get<Ty1>(): TypeName
	14: StLoc[5](loc2: TypeName)
	15: CopyLoc[4](loc1: TypeName)
	16: CopyLoc[5](loc2: TypeName)
	17: Neq
	18: BrFalse(20)
B4:
	19: Branch(26)
B5:
	20: MoveLoc[0](Arg0: &mut Registry)
	21: Pop
	22: MoveLoc[2](Arg2: &mut TxContext)
	23: Pop
	24: LdConst[4](u64: 4)
	25: Abort
B6:
	26: CopyLoc[0](Arg0: &mut Registry)
	27: ImmBorrowField[0](Registry.pools: Table<PoolKey, ID>)
	28: CopyLoc[4](loc1: TypeName)
	29: CopyLoc[5](loc2: TypeName)
	30: Pack[2](PoolKey)
	31: Call table::contains<PoolKey, ID>(&Table<PoolKey, ID>, PoolKey): bool
	32: Not
	33: BrFalse(43)
B7:
	34: CopyLoc[0](Arg0: &mut Registry)
	35: ImmBorrowField[0](Registry.pools: Table<PoolKey, ID>)
	36: CopyLoc[5](loc2: TypeName)
	37: CopyLoc[4](loc1: TypeName)
	38: Pack[2](PoolKey)
	39: Call table::contains<PoolKey, ID>(&Table<PoolKey, ID>, PoolKey): bool
	40: Not
	41: StLoc[3](loc0: bool)
	42: Branch(45)
B8:
	43: LdFalse
	44: StLoc[3](loc0: bool)
B9:
	45: MoveLoc[3](loc0: bool)
	46: BrFalse(48)
B10:
	47: Branch(54)
B11:
	48: MoveLoc[0](Arg0: &mut Registry)
	49: Pop
	50: MoveLoc[2](Arg2: &mut TxContext)
	51: Pop
	52: LdConst[2](u64: 2)
	53: Abort
B12:
	54: MoveLoc[2](Arg2: &mut TxContext)
	55: Call object::new(&mut TxContext): UID
	56: Call balance::zero<Ty0>(): Balance<Ty0>
	57: Call balance::zero<Ty1>(): Balance<Ty1>
	58: LdFalse
	59: PackGeneric[0](LP<Ty0, Ty1>)
	60: Call balance::create_supply<LP<Ty0, Ty1>>(LP<Ty0, Ty1>): Supply<LP<Ty0, Ty1>>
	61: Call balance::zero<LP<Ty0, Ty1>>(): Balance<LP<Ty0, Ty1>>
	62: CopyLoc[1](Arg1: u64)
	63: PackGeneric[1](Pool<Ty0, Ty1>)
	64: StLoc[6](loc3: Pool<Ty0, Ty1>)
	65: ImmBorrowLoc[6](loc3: Pool<Ty0, Ty1>)
	66: Call object::id<Pool<Ty0, Ty1>>(&Pool<Ty0, Ty1>): ID
	67: StLoc[7](loc4: ID)
	68: MoveLoc[0](Arg0: &mut Registry)
	69: MutBorrowField[0](Registry.pools: Table<PoolKey, ID>)
	70: CopyLoc[4](loc1: TypeName)
	71: CopyLoc[5](loc2: TypeName)
	72: Pack[2](PoolKey)
	73: CopyLoc[7](loc4: ID)
	74: Call table::add<PoolKey, ID>(&mut Table<PoolKey, ID>, PoolKey, ID)
	75: CopyLoc[7](loc4: ID)
	76: MoveLoc[4](loc1: TypeName)
	77: MoveLoc[5](loc2: TypeName)
	78: MoveLoc[1](Arg1: u64)
	79: Pack[4](PoolCreated)
	80: Call event::emit<PoolCreated>(PoolCreated)
	81: MoveLoc[6](loc3: Pool<Ty0, Ty1>)
	82: Call transfer::share_object<Pool<Ty0, Ty1>>(Pool<Ty0, Ty1>)
	83: MoveLoc[7](loc4: ID)
	84: Ret
}

public find_pool<Ty0, Ty1>(Arg0: &Registry): Option<ID> {
L1:	loc0: Option<ID>
L2:	loc1: Option<ID>
L3:	loc2: TypeName
L4:	loc3: TypeName
B0:
	0: Call type_name::get<Ty0>(): TypeName
	1: StLoc[3](loc2: TypeName)
	2: Call type_name::get<Ty1>(): TypeName
	3: StLoc[4](loc3: TypeName)
	4: CopyLoc[0](Arg0: &Registry)
	5: ImmBorrowField[0](Registry.pools: Table<PoolKey, ID>)
	6: CopyLoc[3](loc2: TypeName)
	7: CopyLoc[4](loc3: TypeName)
	8: Pack[2](PoolKey)
	9: Call table::contains<PoolKey, ID>(&Table<PoolKey, ID>, PoolKey): bool
	10: BrFalse(21)
B1:
	11: MoveLoc[0](Arg0: &Registry)
	12: ImmBorrowField[0](Registry.pools: Table<PoolKey, ID>)
	13: MoveLoc[3](loc2: TypeName)
	14: MoveLoc[4](loc3: TypeName)
	15: Pack[2](PoolKey)
	16: Call table::borrow<PoolKey, ID>(&Table<PoolKey, ID>, PoolKey): &ID
	17: ReadRef
	18: Call option::some<ID>(ID): Option<ID>
	19: StLoc[2](loc1: Option<ID>)
	20: Branch(44)
B2:
	21: CopyLoc[0](Arg0: &Registry)
	22: ImmBorrowField[0](Registry.pools: Table<PoolKey, ID>)
	23: CopyLoc[4](loc3: TypeName)
	24: CopyLoc[3](loc2: TypeName)
	25: Pack[2](PoolKey)
	26: Call table::contains<PoolKey, ID>(&Table<PoolKey, ID>, PoolKey): bool
	27: BrFalse(38)
B3:
	28: MoveLoc[0](Arg0: &Registry)
	29: ImmBorrowField[0](Registry.pools: Table<PoolKey, ID>)
	30: MoveLoc[4](loc3: TypeName)
	31: MoveLoc[3](loc2: TypeName)
	32: Pack[2](PoolKey)
	33: Call table::borrow<PoolKey, ID>(&Table<PoolKey, ID>, PoolKey): &ID
	34: ReadRef
	35: Call option::some<ID>(ID): Option<ID>
	36: StLoc[1](loc0: Option<ID>)
	37: Branch(42)
B4:
	38: MoveLoc[0](Arg0: &Registry)
	39: Pop
	40: Call option::none<ID>(): Option<ID>
	41: StLoc[1](loc0: Option<ID>)
B5:
	42: MoveLoc[1](loc0: Option<ID>)
	43: StLoc[2](loc1: Option<ID>)
B6:
	44: MoveLoc[2](loc1: Option<ID>)
	45: Ret
}

public add_liquidity<Ty0, Ty1>(Arg0: &mut Pool<Ty0, Ty1>, Arg1: Coin<Ty0>, Arg2: Coin<Ty1>, Arg3: u64, Arg4: &mut TxContext): Coin<LP<Ty0, Ty1>> {
L5:	loc0: bool
L6:	loc1: u64
L7:	loc2: u64
L8:	loc3: u64
L9:	loc4: u64
L10:	loc5: u64
L11:	loc6: u64
L12:	loc7: u64
L13:	loc8: u64
L14:	loc9: u64
L15:	loc10: u64
L16:	loc11: Balance<LP<Ty0, Ty1>>
L17:	loc12: u64
L18:	loc13: u64
L19:	loc14: u64
L20:	loc15: address
L21:	loc16: u64
L22:	loc17: u64
L23:	loc18: u64
B0:
	0: ImmBorrowLoc[1](Arg1: Coin<Ty0>)
	1: Call coin::value<Ty0>(&Coin<Ty0>): u64
	2: StLoc[12](loc7: u64)
	3: ImmBorrowLoc[2](Arg2: Coin<Ty1>)
	4: Call coin::value<Ty1>(&Coin<Ty1>): u64
	5: StLoc[13](loc8: u64)
	6: CopyLoc[12](loc7: u64)
	7: LdU64(0)
	8: Gt
	9: BrFalse(15)
B1:
	10: CopyLoc[13](loc8: u64)
	11: LdU64(0)
	12: Gt
	13: StLoc[5](loc0: bool)
	14: Branch(17)
B2:
	15: LdFalse
	16: StLoc[5](loc0: bool)
B3:
	17: MoveLoc[5](loc0: bool)
	18: BrFalse(20)
B4:
	19: Branch(26)
B5:
	20: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	21: Pop
	22: MoveLoc[4](Arg4: &mut TxContext)
	23: Pop
	24: LdConst[0](u64: 0)
	25: Abort
B6:
	26: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	27: ImmBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	28: Call balance::value<Ty0>(&Balance<Ty0>): u64
	29: StLoc[18](loc13: u64)
	30: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	31: ImmBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	32: Call balance::value<Ty1>(&Balance<Ty1>): u64
	33: StLoc[19](loc14: u64)
	34: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	35: ImmBorrowFieldGeneric[2](Pool.lp_supply: Supply<LP<Ty0, Ty1>>)
	36: Call balance::supply_value<LP<Ty0, Ty1>>(&Supply<LP<Ty0, Ty1>>): u64
	37: StLoc[21](loc16: u64)
	38: CopyLoc[4](Arg4: &mut TxContext)
	39: FreezeRef
	40: Call tx_context::sender(&TxContext): address
	41: StLoc[20](loc15: address)
	42: CopyLoc[21](loc16: u64)
	43: LdU64(0)
	44: Eq
	45: BrFalse(84)
B7:
	46: CopyLoc[12](loc7: u64)
	47: CastU128
	48: CopyLoc[13](loc8: u64)
	49: CastU128
	50: Mul
	51: Call u128::sqrt(u128): u128
	52: CastU64
	53: StLoc[15](loc10: u64)
	54: CopyLoc[15](loc10: u64)
	55: LdConst[8](u64: 1000)
	56: Gt
	57: BrFalse(59)
B8:
	58: Branch(65)
B9:
	59: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	60: Pop
	61: MoveLoc[4](Arg4: &mut TxContext)
	62: Pop
	63: LdConst[3](u64: 3)
	64: Abort
B10:
	65: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	66: MutBorrowFieldGeneric[2](Pool.lp_supply: Supply<LP<Ty0, Ty1>>)
	67: LdConst[8](u64: 1000)
	68: Call balance::increase_supply<LP<Ty0, Ty1>>(&mut Supply<LP<Ty0, Ty1>>, u64): Balance<LP<Ty0, Ty1>>
	69: StLoc[16](loc11: Balance<LP<Ty0, Ty1>>)
	70: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	71: MutBorrowFieldGeneric[3](Pool.locked_lp: Balance<LP<Ty0, Ty1>>)
	72: MoveLoc[16](loc11: Balance<LP<Ty0, Ty1>>)
	73: Call balance::join<LP<Ty0, Ty1>>(&mut Balance<LP<Ty0, Ty1>>, Balance<LP<Ty0, Ty1>>): u64
	74: Pop
	75: MoveLoc[12](loc7: u64)
	76: MoveLoc[13](loc8: u64)
	77: MoveLoc[15](loc10: u64)
	78: LdConst[8](u64: 1000)
	79: Sub
	80: StLoc[11](loc6: u64)
	81: StLoc[10](loc5: u64)
	82: StLoc[9](loc4: u64)
	83: Branch(121)
B11:
	84: CopyLoc[12](loc7: u64)
	85: CopyLoc[19](loc14: u64)
	86: CopyLoc[18](loc13: u64)
	87: Call mul_div(u64, u64, u64): u64
	88: StLoc[14](loc9: u64)
	89: CopyLoc[14](loc9: u64)
	90: CopyLoc[13](loc8: u64)
	91: Le
	92: BrFalse(103)
B12:
	93: CopyLoc[12](loc7: u64)
	94: MoveLoc[14](loc9: u64)
	95: MoveLoc[12](loc7: u64)
	96: MoveLoc[21](loc16: u64)
	97: MoveLoc[18](loc13: u64)
	98: Call mul_div(u64, u64, u64): u64
	99: StLoc[8](loc3: u64)
	100: StLoc[7](loc2: u64)
	101: StLoc[6](loc1: u64)
	102: Branch(115)
B13:
	103: CopyLoc[13](loc8: u64)
	104: MoveLoc[18](loc13: u64)
	105: CopyLoc[19](loc14: u64)
	106: Call mul_div(u64, u64, u64): u64
	107: CopyLoc[13](loc8: u64)
	108: MoveLoc[13](loc8: u64)
	109: MoveLoc[21](loc16: u64)
	110: MoveLoc[19](loc14: u64)
	111: Call mul_div(u64, u64, u64): u64
	112: StLoc[8](loc3: u64)
	113: StLoc[7](loc2: u64)
	114: StLoc[6](loc1: u64)
B14:
	115: MoveLoc[6](loc1: u64)
	116: MoveLoc[7](loc2: u64)
	117: MoveLoc[8](loc3: u64)
	118: StLoc[11](loc6: u64)
	119: StLoc[10](loc5: u64)
	120: StLoc[9](loc4: u64)
B15:
	121: MoveLoc[9](loc4: u64)
	122: MoveLoc[10](loc5: u64)
	123: MoveLoc[11](loc6: u64)
	124: StLoc[17](loc12: u64)
	125: StLoc[23](loc18: u64)
	126: StLoc[22](loc17: u64)
	127: CopyLoc[17](loc12: u64)
	128: LdU64(0)
	129: Gt
	130: BrFalse(132)
B16:
	131: Branch(138)
B17:
	132: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	133: Pop
	134: MoveLoc[4](Arg4: &mut TxContext)
	135: Pop
	136: LdConst[3](u64: 3)
	137: Abort
B18:
	138: CopyLoc[17](loc12: u64)
	139: MoveLoc[3](Arg3: u64)
	140: Ge
	141: BrFalse(143)
B19:
	142: Branch(149)
B20:
	143: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	144: Pop
	145: MoveLoc[4](Arg4: &mut TxContext)
	146: Pop
	147: LdConst[1](u64: 1)
	148: Abort
B21:
	149: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	150: MutBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	151: MutBorrowLoc[1](Arg1: Coin<Ty0>)
	152: CopyLoc[22](loc17: u64)
	153: CopyLoc[4](Arg4: &mut TxContext)
	154: Call coin::split<Ty0>(&mut Coin<Ty0>, u64, &mut TxContext): Coin<Ty0>
	155: Call coin::into_balance<Ty0>(Coin<Ty0>): Balance<Ty0>
	156: Call balance::join<Ty0>(&mut Balance<Ty0>, Balance<Ty0>): u64
	157: Pop
	158: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	159: MutBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	160: MutBorrowLoc[2](Arg2: Coin<Ty1>)
	161: CopyLoc[23](loc18: u64)
	162: CopyLoc[4](Arg4: &mut TxContext)
	163: Call coin::split<Ty1>(&mut Coin<Ty1>, u64, &mut TxContext): Coin<Ty1>
	164: Call coin::into_balance<Ty1>(Coin<Ty1>): Balance<Ty1>
	165: Call balance::join<Ty1>(&mut Balance<Ty1>, Balance<Ty1>): u64
	166: Pop
	167: MoveLoc[1](Arg1: Coin<Ty0>)
	168: CopyLoc[20](loc15: address)
	169: Call refund_or_destroy<Ty0>(Coin<Ty0>, address)
	170: MoveLoc[2](Arg2: Coin<Ty1>)
	171: CopyLoc[20](loc15: address)
	172: Call refund_or_destroy<Ty1>(Coin<Ty1>, address)
	173: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	174: FreezeRef
	175: Call object::id<Pool<Ty0, Ty1>>(&Pool<Ty0, Ty1>): ID
	176: MoveLoc[20](loc15: address)
	177: MoveLoc[22](loc17: u64)
	178: MoveLoc[23](loc18: u64)
	179: CopyLoc[17](loc12: u64)
	180: Pack[5](LiquidityAdded)
	181: Call event::emit<LiquidityAdded>(LiquidityAdded)
	182: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	183: MutBorrowFieldGeneric[2](Pool.lp_supply: Supply<LP<Ty0, Ty1>>)
	184: MoveLoc[17](loc12: u64)
	185: Call balance::increase_supply<LP<Ty0, Ty1>>(&mut Supply<LP<Ty0, Ty1>>, u64): Balance<LP<Ty0, Ty1>>
	186: MoveLoc[4](Arg4: &mut TxContext)
	187: Call coin::from_balance<LP<Ty0, Ty1>>(Balance<LP<Ty0, Ty1>>, &mut TxContext): Coin<LP<Ty0, Ty1>>
	188: Ret
}

public remove_liquidity<Ty0, Ty1>(Arg0: &mut Pool<Ty0, Ty1>, Arg1: Coin<LP<Ty0, Ty1>>, Arg2: u64, Arg3: u64, Arg4: &mut TxContext): Coin<Ty0> * Coin<Ty1> {
L5:	loc0: bool
L6:	loc1: bool
L7:	loc2: u64
L8:	loc3: u64
L9:	loc4: u64
L10:	loc5: u64
B0:
	0: ImmBorrowLoc[1](Arg1: Coin<LP<Ty0, Ty1>>)
	1: Call coin::value<LP<Ty0, Ty1>>(&Coin<LP<Ty0, Ty1>>): u64
	2: StLoc[9](loc4: u64)
	3: CopyLoc[9](loc4: u64)
	4: LdU64(0)
	5: Gt
	6: BrFalse(8)
B1:
	7: Branch(14)
B2:
	8: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	9: Pop
	10: MoveLoc[4](Arg4: &mut TxContext)
	11: Pop
	12: LdConst[0](u64: 0)
	13: Abort
B3:
	14: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	15: ImmBorrowFieldGeneric[2](Pool.lp_supply: Supply<LP<Ty0, Ty1>>)
	16: Call balance::supply_value<LP<Ty0, Ty1>>(&Supply<LP<Ty0, Ty1>>): u64
	17: StLoc[10](loc5: u64)
	18: CopyLoc[9](loc4: u64)
	19: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	20: ImmBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	21: Call balance::value<Ty0>(&Balance<Ty0>): u64
	22: CopyLoc[10](loc5: u64)
	23: Call mul_div(u64, u64, u64): u64
	24: StLoc[7](loc2: u64)
	25: CopyLoc[9](loc4: u64)
	26: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	27: ImmBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	28: Call balance::value<Ty1>(&Balance<Ty1>): u64
	29: MoveLoc[10](loc5: u64)
	30: Call mul_div(u64, u64, u64): u64
	31: StLoc[8](loc3: u64)
	32: CopyLoc[7](loc2: u64)
	33: LdU64(0)
	34: Gt
	35: BrFalse(41)
B4:
	36: CopyLoc[8](loc3: u64)
	37: LdU64(0)
	38: Gt
	39: StLoc[5](loc0: bool)
	40: Branch(43)
B5:
	41: LdFalse
	42: StLoc[5](loc0: bool)
B6:
	43: MoveLoc[5](loc0: bool)
	44: BrFalse(46)
B7:
	45: Branch(52)
B8:
	46: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	47: Pop
	48: MoveLoc[4](Arg4: &mut TxContext)
	49: Pop
	50: LdConst[3](u64: 3)
	51: Abort
B9:
	52: CopyLoc[7](loc2: u64)
	53: MoveLoc[2](Arg2: u64)
	54: Ge
	55: BrFalse(61)
B10:
	56: CopyLoc[8](loc3: u64)
	57: MoveLoc[3](Arg3: u64)
	58: Ge
	59: StLoc[6](loc1: bool)
	60: Branch(63)
B11:
	61: LdFalse
	62: StLoc[6](loc1: bool)
B12:
	63: MoveLoc[6](loc1: bool)
	64: BrFalse(66)
B13:
	65: Branch(72)
B14:
	66: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	67: Pop
	68: MoveLoc[4](Arg4: &mut TxContext)
	69: Pop
	70: LdConst[1](u64: 1)
	71: Abort
B15:
	72: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	73: MutBorrowFieldGeneric[2](Pool.lp_supply: Supply<LP<Ty0, Ty1>>)
	74: MoveLoc[1](Arg1: Coin<LP<Ty0, Ty1>>)
	75: Call coin::into_balance<LP<Ty0, Ty1>>(Coin<LP<Ty0, Ty1>>): Balance<LP<Ty0, Ty1>>
	76: Call balance::decrease_supply<LP<Ty0, Ty1>>(&mut Supply<LP<Ty0, Ty1>>, Balance<LP<Ty0, Ty1>>): u64
	77: Pop
	78: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	79: FreezeRef
	80: Call object::id<Pool<Ty0, Ty1>>(&Pool<Ty0, Ty1>): ID
	81: CopyLoc[4](Arg4: &mut TxContext)
	82: FreezeRef
	83: Call tx_context::sender(&TxContext): address
	84: CopyLoc[7](loc2: u64)
	85: CopyLoc[8](loc3: u64)
	86: MoveLoc[9](loc4: u64)
	87: Pack[6](LiquidityRemoved)
	88: Call event::emit<LiquidityRemoved>(LiquidityRemoved)
	89: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	90: MutBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	91: MoveLoc[7](loc2: u64)
	92: Call balance::split<Ty0>(&mut Balance<Ty0>, u64): Balance<Ty0>
	93: CopyLoc[4](Arg4: &mut TxContext)
	94: Call coin::from_balance<Ty0>(Balance<Ty0>, &mut TxContext): Coin<Ty0>
	95: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	96: MutBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	97: MoveLoc[8](loc3: u64)
	98: Call balance::split<Ty1>(&mut Balance<Ty1>, u64): Balance<Ty1>
	99: MoveLoc[4](Arg4: &mut TxContext)
	100: Call coin::from_balance<Ty1>(Balance<Ty1>, &mut TxContext): Coin<Ty1>
	101: Ret
}

public swap_a_to_b<Ty0, Ty1>(Arg0: &mut Pool<Ty0, Ty1>, Arg1: Coin<Ty0>, Arg2: u64, Arg3: &mut TxContext): Coin<Ty1> {
L4:	loc0: u64
L5:	loc1: u64
B0:
	0: ImmBorrowLoc[1](Arg1: Coin<Ty0>)
	1: Call coin::value<Ty0>(&Coin<Ty0>): u64
	2: StLoc[4](loc0: u64)
	3: CopyLoc[4](loc0: u64)
	4: LdU64(0)
	5: Gt
	6: BrFalse(8)
B1:
	7: Branch(14)
B2:
	8: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	9: Pop
	10: MoveLoc[3](Arg3: &mut TxContext)
	11: Pop
	12: LdConst[0](u64: 0)
	13: Abort
B3:
	14: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	15: FreezeRef
	16: CopyLoc[4](loc0: u64)
	17: Call quote_a_to_b<Ty0, Ty1>(&Pool<Ty0, Ty1>, u64): u64
	18: StLoc[5](loc1: u64)
	19: CopyLoc[5](loc1: u64)
	20: MoveLoc[2](Arg2: u64)
	21: Ge
	22: BrFalse(24)
B4:
	23: Branch(30)
B5:
	24: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	25: Pop
	26: MoveLoc[3](Arg3: &mut TxContext)
	27: Pop
	28: LdConst[1](u64: 1)
	29: Abort
B6:
	30: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	31: MutBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	32: MoveLoc[1](Arg1: Coin<Ty0>)
	33: Call coin::into_balance<Ty0>(Coin<Ty0>): Balance<Ty0>
	34: Call balance::join<Ty0>(&mut Balance<Ty0>, Balance<Ty0>): u64
	35: Pop
	36: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	37: FreezeRef
	38: Call object::id<Pool<Ty0, Ty1>>(&Pool<Ty0, Ty1>): ID
	39: CopyLoc[3](Arg3: &mut TxContext)
	40: FreezeRef
	41: Call tx_context::sender(&TxContext): address
	42: LdTrue
	43: MoveLoc[4](loc0: u64)
	44: CopyLoc[5](loc1: u64)
	45: Pack[7](Swapped)
	46: Call event::emit<Swapped>(Swapped)
	47: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	48: MutBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	49: MoveLoc[5](loc1: u64)
	50: Call balance::split<Ty1>(&mut Balance<Ty1>, u64): Balance<Ty1>
	51: MoveLoc[3](Arg3: &mut TxContext)
	52: Call coin::from_balance<Ty1>(Balance<Ty1>, &mut TxContext): Coin<Ty1>
	53: Ret
}

public swap_b_to_a<Ty0, Ty1>(Arg0: &mut Pool<Ty0, Ty1>, Arg1: Coin<Ty1>, Arg2: u64, Arg3: &mut TxContext): Coin<Ty0> {
L4:	loc0: u64
L5:	loc1: u64
B0:
	0: ImmBorrowLoc[1](Arg1: Coin<Ty1>)
	1: Call coin::value<Ty1>(&Coin<Ty1>): u64
	2: StLoc[4](loc0: u64)
	3: CopyLoc[4](loc0: u64)
	4: LdU64(0)
	5: Gt
	6: BrFalse(8)
B1:
	7: Branch(14)
B2:
	8: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	9: Pop
	10: MoveLoc[3](Arg3: &mut TxContext)
	11: Pop
	12: LdConst[0](u64: 0)
	13: Abort
B3:
	14: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	15: FreezeRef
	16: CopyLoc[4](loc0: u64)
	17: Call quote_b_to_a<Ty0, Ty1>(&Pool<Ty0, Ty1>, u64): u64
	18: StLoc[5](loc1: u64)
	19: CopyLoc[5](loc1: u64)
	20: MoveLoc[2](Arg2: u64)
	21: Ge
	22: BrFalse(24)
B4:
	23: Branch(30)
B5:
	24: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	25: Pop
	26: MoveLoc[3](Arg3: &mut TxContext)
	27: Pop
	28: LdConst[1](u64: 1)
	29: Abort
B6:
	30: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	31: MutBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	32: MoveLoc[1](Arg1: Coin<Ty1>)
	33: Call coin::into_balance<Ty1>(Coin<Ty1>): Balance<Ty1>
	34: Call balance::join<Ty1>(&mut Balance<Ty1>, Balance<Ty1>): u64
	35: Pop
	36: CopyLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	37: FreezeRef
	38: Call object::id<Pool<Ty0, Ty1>>(&Pool<Ty0, Ty1>): ID
	39: CopyLoc[3](Arg3: &mut TxContext)
	40: FreezeRef
	41: Call tx_context::sender(&TxContext): address
	42: LdFalse
	43: MoveLoc[4](loc0: u64)
	44: CopyLoc[5](loc1: u64)
	45: Pack[7](Swapped)
	46: Call event::emit<Swapped>(Swapped)
	47: MoveLoc[0](Arg0: &mut Pool<Ty0, Ty1>)
	48: MutBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	49: MoveLoc[5](loc1: u64)
	50: Call balance::split<Ty0>(&mut Balance<Ty0>, u64): Balance<Ty0>
	51: MoveLoc[3](Arg3: &mut TxContext)
	52: Call coin::from_balance<Ty0>(Balance<Ty0>, &mut TxContext): Coin<Ty0>
	53: Ret
}

public quote_a_to_b<Ty0, Ty1>(Arg0: &Pool<Ty0, Ty1>, Arg1: u64): u64 {
B0:
	0: MoveLoc[1](Arg1: u64)
	1: CopyLoc[0](Arg0: &Pool<Ty0, Ty1>)
	2: ImmBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	3: Call balance::value<Ty0>(&Balance<Ty0>): u64
	4: CopyLoc[0](Arg0: &Pool<Ty0, Ty1>)
	5: ImmBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	6: Call balance::value<Ty1>(&Balance<Ty1>): u64
	7: MoveLoc[0](Arg0: &Pool<Ty0, Ty1>)
	8: ImmBorrowFieldGeneric[4](Pool.fee_bps: u64)
	9: ReadRef
	10: Call get_amount_out(u64, u64, u64, u64): u64
	11: Ret
}

public quote_b_to_a<Ty0, Ty1>(Arg0: &Pool<Ty0, Ty1>, Arg1: u64): u64 {
B0:
	0: MoveLoc[1](Arg1: u64)
	1: CopyLoc[0](Arg0: &Pool<Ty0, Ty1>)
	2: ImmBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	3: Call balance::value<Ty1>(&Balance<Ty1>): u64
	4: CopyLoc[0](Arg0: &Pool<Ty0, Ty1>)
	5: ImmBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	6: Call balance::value<Ty0>(&Balance<Ty0>): u64
	7: MoveLoc[0](Arg0: &Pool<Ty0, Ty1>)
	8: ImmBorrowFieldGeneric[4](Pool.fee_bps: u64)
	9: ReadRef
	10: Call get_amount_out(u64, u64, u64, u64): u64
	11: Ret
}

public reserves<Ty0, Ty1>(Arg0: &Pool<Ty0, Ty1>): u64 * u64 {
B0:
	0: CopyLoc[0](Arg0: &Pool<Ty0, Ty1>)
	1: ImmBorrowFieldGeneric[0](Pool.reserve_a: Balance<Ty0>)
	2: Call balance::value<Ty0>(&Balance<Ty0>): u64
	3: MoveLoc[0](Arg0: &Pool<Ty0, Ty1>)
	4: ImmBorrowFieldGeneric[1](Pool.reserve_b: Balance<Ty1>)
	5: Call balance::value<Ty1>(&Balance<Ty1>): u64
	6: Ret
}

public lp_supply<Ty0, Ty1>(Arg0: &Pool<Ty0, Ty1>): u64 {
B0:
	0: MoveLoc[0](Arg0: &Pool<Ty0, Ty1>)
	1: ImmBorrowFieldGeneric[2](Pool.lp_supply: Supply<LP<Ty0, Ty1>>)
	2: Call balance::supply_value<LP<Ty0, Ty1>>(&Supply<LP<Ty0, Ty1>>): u64
	3: Ret
}

public fee_bps<Ty0, Ty1>(Arg0: &Pool<Ty0, Ty1>): u64 {
B0:
	0: MoveLoc[0](Arg0: &Pool<Ty0, Ty1>)
	1: ImmBorrowFieldGeneric[4](Pool.fee_bps: u64)
	2: ReadRef
	3: Ret
}

public get_amount_out(Arg0: u64, Arg1: u64, Arg2: u64, Arg3: u64): u64 {
L4:	loc0: bool
L5:	loc1: u128
L6:	loc2: u128
L7:	loc3: u128
B0:
	0: CopyLoc[1](Arg1: u64)
	1: LdU64(0)
	2: Gt
	3: BrFalse(9)
B1:
	4: CopyLoc[2](Arg2: u64)
	5: LdU64(0)
	6: Gt
	7: StLoc[4](loc0: bool)
	8: Branch(11)
B2:
	9: LdFalse
	10: StLoc[4](loc0: bool)
B3:
	11: MoveLoc[4](loc0: bool)
	12: BrFalse(14)
B4:
	13: Branch(16)
B5:
	14: LdConst[6](u64: 6)
	15: Abort
B6:
	16: MoveLoc[0](Arg0: u64)
	17: CastU128
	18: LdConst[7](u64: 10000)
	19: MoveLoc[3](Arg3: u64)
	20: Sub
	21: CastU128
	22: Mul
	23: StLoc[6](loc2: u128)
	24: CopyLoc[6](loc2: u128)
	25: MoveLoc[2](Arg2: u64)
	26: CastU128
	27: Mul
	28: StLoc[7](loc3: u128)
	29: MoveLoc[1](Arg1: u64)
	30: CastU128
	31: LdConst[7](u64: 10000)
	32: CastU128
	33: Mul
	34: MoveLoc[6](loc2: u128)
	35: Add
	36: StLoc[5](loc1: u128)
	37: MoveLoc[7](loc3: u128)
	38: MoveLoc[5](loc1: u128)
	39: Div
	40: CastU64
	41: Ret
}

mul_div(Arg0: u64, Arg1: u64, Arg2: u64): u64 {
B0:
	0: MoveLoc[0](Arg0: u64)
	1: CastU128
	2: MoveLoc[1](Arg1: u64)
	3: CastU128
	4: Mul
	5: MoveLoc[2](Arg2: u64)
	6: CastU128
	7: Div
	8: CastU64
	9: Ret
}

refund_or_destroy<Ty0>(Arg0: Coin<Ty0>, Arg1: address) {
B0:
	0: ImmBorrowLoc[0](Arg0: Coin<Ty0>)
	1: Call coin::value<Ty0>(&Coin<Ty0>): u64
	2: LdU64(0)
	3: Eq
	4: BrFalse(8)
B1:
	5: MoveLoc[0](Arg0: Coin<Ty0>)
	6: Call coin::destroy_zero<Ty0>(Coin<Ty0>)
	7: Branch(11)
B2:
	8: MoveLoc[0](Arg0: Coin<Ty0>)
	9: MoveLoc[1](Arg1: address)
	10: Call transfer::public_transfer<Coin<Ty0>>(Coin<Ty0>, address)
B3:
	11: Ret
}

Constants [
	0 => u64: 0
	1 => u64: 1
	2 => u64: 2
	3 => u64: 3
	4 => u64: 4
	5 => u64: 5
	6 => u64: 6
	7 => u64: 10000
	8 => u64: 1000
]
}